8fc810787b
2010-06-03 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/c++config (std::size_t, std::ptrdiff_t, std::nullptr_t): Provide typedefs. * include/c_std/cstddef: Don't provide std::size_t and std::ptrdiff_t here. * include/c_global/cstddef: Likewise. * src/condition_variable.cc: Don't include <cstddef>, don't use NULL, use std::size_t and std::ptrdiff_t. * src/mt_allocator.cc: Likewise. * src/localename.cc: Likewise. * src/chrono.cc: Likewise. * src/thread.cc: Likewise. * include/debug/formatter.h: Likewise. * include/debug/functions.h: Likewise. * include/std/valarray: Likewise. * include/std/thread: Likewise. * include/std/type_traits: Likewise. * include/std/atomic: Likewise. * include/std/iterator: Likewise. * include/std/bitset: Likewise. * include/std/fstream: Likewise. * include/std/mutex: Likewise. * include/c_std/cstdlib: Likewise. * include/c_std/cstdio: Likewise. * include/c_std/ctime: Likewise. * include/c_std/cwchar: Likewise. * include/c_std/cstring: Likewise. * include/parallel/multiway_merge.h: Likewise. * include/parallel/multiseq_selection.h: Likewise. * include/parallel/base.h: Likewise. * include/parallel/basic_iterator.h: Likewise. * include/parallel/multiway_mergesort.h * include/parallel/partition.h: Likewise. * include/ext/string_conversions.h: Likewise. * include/ext/pb_ds/assoc_container.hpp: Likewise. * include/ext/pb_ds/detail/resize_policy/sample_size_policy.hpp: Likewise. * include/ext/pb_ds/detail/resize_policy/ hash_prime_size_policy_imp.hpp: Likewise. * include/ext/pb_ds/detail/resize_policy/ sample_resize_policy.hpp: Likewise. * include/ext/pb_ds/detail/resize_policy/ sample_resize_trigger.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/binomial_heap_base_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ erase_store_hash_fn_imps.hpp: Likewise. * include/ext/pb_ds/d: Likewise.etail/cc_hash_table_map_/ insert_no_store_hash_fn_imps.hpp * include/ext/pb_ds/detail/cc_hash_table_map_/ cmp_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ insert_store_hash_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ info_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ entry_list_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ trace_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ cc_ht_map_.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ resize_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ constructor_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/cc_hash_table_map_/ erase_no_store_hash_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/unordered_iterator/ iterator.hpp: Likewise. * include/ext/pb_ds/detail/unordered_iterator/ const_iterator.hpp: Likewise. * include/ext/pb_ds/detail/unordered_iterator/ point_iterator.hpp: Likewise. * include/ext/pb_ds/detail/unordered_iterator/ const_point_iterator.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/r_erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/child_iterator.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/ insert_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/ const_child_iterator.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/rotate_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/node_iterators.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/internal_node.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/point_iterators.hpp: Likewise. * include/ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ r_erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ rotate_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ node_iterators.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ point_iterators.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/bin_search_tree_/ iterators_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/gp_hash_table_map_/ find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/gp_hash_table_map_/ gp_ht_map_.hpp: Likewise. * include/ext/pb_ds/detail/gp_hash_table_map_/ resize_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/gp_hash_table_map_/ standard_policies.hpp: Likewise. * include/ext/pb_ds/detail/tree_policy/ sample_tree_node_update.hpp: Likewise. * include/ext/pb_ds/detail/basic_tree_policy/ null_node_metadata.hpp: Likewise. * include/ext/pb_ds/detail/binary_heap_/const_iterator.hpp: Likewise. * include/ext/pb_ds/detail/binary_heap_/ const_point_iterator.hpp: Likewise. * include/ext/pb_ds/detail/binary_heap_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/trie_policy/ sample_trie_node_update.hpp: Likewise. * include/ext/pb_ds/detail/trie_policy/ sample_trie_e_access_traits.hpp: Likewise. * include/ext/pb_ds/detail/pairing_heap_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pairing_heap_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pairing_heap_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/pairing_heap_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_policy/ counter_lu_metadata.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ trace_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ null_metadata.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ const_iterator.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ iterators_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/left_child_next_sibling_heap_/ const_point_iterator.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/thin_heap_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/ constructors_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/node_iterators.hpp: Likewise. * include/ext/pb_ds/detail/ov_tree_map_/ iterators_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/hash_fn/sample_probe_fn.hpp: Likewise. * include/ext/pb_ds/detail/hash_fn/ sample_ranged_probe_fn.hpp: Likewise. * include/ext/pb_ds/detail/hash_fn/sample_range_hashing.hpp: Likewise. * include/ext/pb_ds/detail/hash_fn/ sample_ranged_hash_fn.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/splay_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/splay_tree_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ trace_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ find_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/lu_map_.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ constructor_destructor_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ info_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/list_update_map_/ iterators_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rc_binomial_heap_/ erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rc_binomial_heap_/ insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rc_binomial_heap_/ debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/ split_join_fn_imps.hpp: Likewise. * include/ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp: Likewise. * include/ext/pb_ds/list_update_policy.hpp: Likewise. * include/ext/pb_ds/exception.hpp: Likewise. * include/ext/pb_ds/tree_policy.hpp: Likewise. * include/ext/pb_ds/tag_and_trait.hpp: Likewise. * include/ext/pb_ds/hash_policy.hpp: Likewise. * include/ext/pb_ds/trie_policy.hpp: Likewise. * include/ext/pb_ds/priority_queue.hpp: Likewise. * include/ext/throw_allocator.h: Likewis: Likewise.e. * include/ext/bitmap_allocator.h * include/ext/rc_string_base.h: Likewise. * include/ext/new_allocator.h: Likewise. * include/ext/codecvt_specializations.h: Likewise. * include/ext/functional: Likewise.: Likewise. * include/ext/array_allocator.h: Likewise. * include/ext/mt_allocator.h: Likewise. * include/ext/sso_string_base.h: Likewise. * include/profile/impl/profiler_trace.h: Likewise. * include/profile/impl/profiler_node.h: Likewise. * include/bits/stl_algobase.h: Likewise. * include/bits/functional_hash.h: Likewise. * include/bits/locale_facets.tcc: Likewise. * include/bits/locale_facets.h: Likewise. * include/bits/stl_iterator_base_types.h: Likewise. * include/bits/move.h: Likewise. * include/bits/boost_concept_check.h: Likewise. * include/bits/basic_string.tcc: Likewise. * include/bits/locale_facets_nonio.tcc: Likewise. * include/bits/fstream.tcc: Likewise. * include/bits/locale_facets_nonio.h: Likewise. * include/c_global/cstdlib: Likewise. * include/c_global/cstdio: Likewise. * include/c_global/ctime: Likewise. * include/c_global/cwchar: Likewise. * include/c_global/cstring * include/tr1/type_traits: Likewise. * include/backward/hash_fun.h: Likewise. * libsupc++/new: Likewise. * libsupc++/initializer_list: Likewise. * testsuite/27_io/basic_ofstream/pthread2.cc: Likewise. * testsuite/27_io/basic_iostream/cons/2020.cc: Likewise. * testsuite/27_io/basic_streambuf/sgetn/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sgetn/char/1.cc: Likewise. * testsuite/27_io/basic_streambuf/overflow/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_streambuf/overflow/char/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sgetc/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sgetc/char/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sputn/wchar_t/1057.cc: Likewise. * testsuite/27_io/basic_streambuf/sputn/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sputn/char/1057.cc: Likewise. * testsuite/27_io/basic_streambuf/sputn/char/1.cc: Likewise. * testsuite/27_io/basic_streambuf/sputc/wchar_t/1057.cc: Likewise. * testsuite/27_io/basic_streambuf/sputc/char/1057.cc: Likewise. * testsuite/27_io/objects/wchar_t/5268.cc: Likewise. * testsuite/27_io/objects/char/9661-1.cc: Likewise. * testsuite/27_io/objects/char/5268.cc: Likewise. * testsuite/27_io/objects/char/10.cc: Likewise. * testsuite/27_io/basic_ios/copyfmt/char/1.cc: Likewise. * testsuite/27_io/basic_ios/copyfmt/char/2.cc: Likewise. * testsuite/27_io/basic_ios/exceptions/char/1.cc: Likewise. * testsuite/27_io/basic_ios/locales/char/1.cc: Likewise. * testsuite/27_io/basic_ios/clear/char/1.cc: Likewise. * testsuite/27_io/basic_ostringstream/pthread3.cc: Likewise. * testsuite/27_io/basic_stringbuf/sputc/wchar_t/1057.cc: Likewise. * testsuite/27_io/basic_stringbuf/sputc/char/1057.cc: Likewise. * testsuite/27_io/basic_stringbuf/sputn/wchar_t/1057.cc: Likewise. * testsuite/27_io/basic_stringbuf/sputn/char/1057.cc: Likewise. * testsuite/27_io/basic_istream/get/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/get/char/1.cc: Likewise. * testsuite/27_io/basic_istream/ignore/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/ignore/char/1.cc: Likewise. * testsuite/27_io/basic_istream/peek/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/peek/char/1.cc: Likewise. * testsuite/27_io/basic_istream/getline/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/getline/char/1.cc: Likewise. * testsuite/27_io/basic_istream/extractors_other/wchar_t/ exceptions_null.cc * testsuite/27_io/basic_istream/extractors_other/wchar_t/ 1.cc: Likewise. * testsuite/27_io/basic_istream/extractors_other/char/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_istream/extractors_other/char/1.cc: Likewise. * testsuite/27_io/basic_istream/cons/3.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/ wchar_t/01.cc: Likewise. * testsuite/27_io/basic_istream/extractors_arithmetic/ char/01.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ wchar_t/2.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ wchar_t/3.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ char/1.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ char/2.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ char/3.cc: Likewise. * testsuite/27_io/basic_istream/extractors_character/ char/9826.cc: Likewise. * testsuite/27_io/basic_istream/read/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_istream/read/char/1.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/wchar_t/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/wchar_t/ 1.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/char/ exceptions_null.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_other/char/1.cc: Likewise. * testsuite/27_io/basic_ostream/cons/2020.cc: Likewise. * testsuite/27_io/basic_ostream/sentry/pod/1.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_character/ wchar_t/8.cc: Likewise. * testsuite/27_io/basic_ostream/inserters_character/ char/8.cc: Likewise. * testsuite/27_io/basic_filebuf/setbuf/char/1.cc: Likewise. * testsuite/27_io/basic_filebuf/sputc/char/1057.cc: Likewise. * testsuite/27_io/basic_filebuf/open/char/1.cc: Likewise. * testsuite/27_io/basic_filebuf/open/char/2.cc: Likewise. * testsuite/27_io/basic_filebuf/open/char/9507.cc: Likewise. * testsuite/27_io/basic_filebuf/imbue/wchar_t/14975-2.cc: Likewise. * testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-1.cc: Likewise. * testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-2.cc: Likewise. * testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-3.cc: Likewise. * testsuite/27_io/basic_filebuf/overflow/wchar_t/11305-4.cc: Likewise. * testsuite/27_io/basic_filebuf/close/wchar_t/12790-3.cc: Likewise. * testsuite/27_io/basic_filebuf/close/char/9964.cc: Likewise. * testsuite/27_io/basic_filebuf/close/char/1.cc: Likewise. * testsuite/27_io/basic_filebuf/close/char/2.cc: Likewise. * testsuite/27_io/basic_filebuf/close/char/12790-3.cc: Likewise. * testsuite/27_io/basic_filebuf/sputn/char/1057.cc: Likewise. * testsuite/24_iterators/ostreambuf_iterator/2.cc: Likewise. * testsuite/18_support/bad_exception/23591_thread-1.c * testsuite/18_support/new_delete_placement.cc: Likewise. * testsuite/18_support/pthread_guard.cc: Likewise. * testsuite/21_strings/basic_string/operations/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string/operations/char/1.cc: Likewise. * testsuite/21_strings/basic_string/pthread4.cc: Likewise. * testsuite/21_strings/basic_string/cons/wchar_t/5.cc: Likewise. * testsuite/21_strings/basic_string/cons/char/5.cc: Likewise. * testsuite/30_threads/timed_mutex/cons/assign_neg.cc: Likewise. * testsuite/30_threads/timed_mutex/cons/copy_neg.cc: Likewise. * testsuite/30_threads/recursive_mutex/cons/assign_neg.cc: Likewise. * testsuite/30_threads/recursive_mutex/cons/copy_neg.cc: Likewise. * testsuite/30_threads/mutex/cons/assign_neg.cc: Likewise. * testsuite/30_threads/mutex/cons/copy_neg.cc: Likewise. * testsuite/30_threads/thread/cons/assign_neg.cc: Likewise. * testsuite/30_threads/thread/cons/copy_neg.cc: Likewise. * testsuite/30_threads/recursive_timed_mutex/cons/ assign_neg.cc: Likewise. * testsuite/30_threads/recursive_timed_mutex/cons/ copy_neg.cc: Likewise. * testsuite/ext/mt_allocator/22309_thread.cc: Likewise. * testsuite/ext/slist/23781.cc: Likewise. * testsuite/ext/rope/pthread7-rope.cc: Likewise. * testsuite/ext/stdio_filebuf/char/10063-2.cc: Likewise. * testsuite/22_locale/ctype/is/wchar_t/1.cc: Likewise. * testsuite/22_locale/ctype/is/char/1.cc: Likewise. * testsuite/22_locale/time_put/put/char/12439_1.cc: Likewise. * testsuite/22_locale/time_put/put/char/12439_3.cc: Likewise. * testsuite/22_locale/locale/cons/2.cc: Likewise. * testsuite/22_locale/locale/cons/12658_thread-1.cc: Likewise. * testsuite/22_locale/locale/cons/29217.cc: Likewise. * testsuite/22_locale/locale/global_locale_objects/14071.cc: Likewise. * testsuite/22_locale/locale/global_locale_objects/2.cc: Likewise. * testsuite/tr1/6_containers/unordered_multimap/ requirements/iterator_null_neg.cc: Likewise. * testsuite/tr1/6_containers/unordered_multiset/ requirements/iterator_null_neg.cc: Likewise. * testsuite/29_atomics/atomic_address/cons/single_value.cc: Likewise. * testsuite/29_atomics/atomic_address/cons/aggregate.cc: Likewise. * testsuite/23_containers/multimap/23781.cc: Likewise. * testsuite/23_containers/set/23781.cc: Likewise. * testsuite/23_containers/multiset/23781.cc: Likewise. * testsuite/23_containers/list/pthread1.cc: Likewise. * testsuite/23_containers/list/23781.cc: Likewise. * testsuite/23_containers/map/pthread6.cc: Likewise. * testsuite/23_containers/map/23781.cc: Likewise. * testsuite/util/regression/rand/priority_queue/ rand_regression_test.hpp: Likewise. * testsuite/util/regression/rand/priority_queue/ container_rand_regression_test.tcc: Likewise. * testsuite/util/regression/rand/assoc/ rand_regression_test.hpp: Likewise. * testsuite/util/regression/rand/assoc/ container_rand_regression_test.tcc: Likewise. * testsuite/util/testsuite_hooks.cc: Likewise. * testsuite/util/testsuite_io.h: Likewise. * testsuite/util/testsuite_iterators.h: Likewise. * testsuite/util/replacement_memory_operators.h: Likewise. * testsuite/util/testsuite_allocator.h: Likewise. * testsuite/util/testsuite_performance.h: Likewise. From-SVN: r160231
647 lines
22 KiB
C++
647 lines
22 KiB
C++
// -*- C++ -*-
|
||
|
||
// Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
|
||
//
|
||
// This file is part of the GNU ISO C++ Library. This library is free
|
||
// software; you can redistribute it and/or modify it under the terms
|
||
// of the GNU General Public License as published by the Free Software
|
||
// Foundation; either version 3, or (at your option) any later
|
||
// version.
|
||
|
||
// This library is distributed in the hope that it will be useful, but
|
||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
// General Public License for more details.
|
||
|
||
// Under Section 7 of GPL version 3, you are granted additional
|
||
// permissions described in the GCC Runtime Library Exception, version
|
||
// 3.1, as published by the Free Software Foundation.
|
||
|
||
// You should have received a copy of the GNU General Public License and
|
||
// a copy of the GCC Runtime Library Exception along with this program;
|
||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||
// <http://www.gnu.org/licenses/>.
|
||
|
||
/** @file parallel/multiseq_selection.h
|
||
* @brief Functions to find elements of a certain global __rank in
|
||
* multiple sorted sequences. Also serves for splitting such
|
||
* sequence sets.
|
||
*
|
||
* The algorithm description can be found in
|
||
*
|
||
* P. J. Varman, S. D. Scheufler, B. R. Iyer, and G. R. Ricard.
|
||
* Merging Multiple Lists on Hierarchical-Memory Multiprocessors.
|
||
* Journal of Parallel and Distributed Computing, 12(2):171–177, 1991.
|
||
*
|
||
* This file is a GNU parallel extension to the Standard C++ Library.
|
||
*/
|
||
|
||
// Written by Johannes Singler.
|
||
|
||
#ifndef _GLIBCXX_PARALLEL_MULTISEQ_SELECTION_H
|
||
#define _GLIBCXX_PARALLEL_MULTISEQ_SELECTION_H 1
|
||
|
||
#include <vector>
|
||
#include <queue>
|
||
|
||
#include <bits/stl_algo.h>
|
||
|
||
#include <parallel/sort.h>
|
||
|
||
namespace __gnu_parallel
|
||
{
|
||
/** @brief Compare __a pair of types lexicographically, ascending. */
|
||
template<typename _T1, typename _T2, typename _Compare>
|
||
class _Lexicographic
|
||
: public std::binary_function<std::pair<_T1, _T2>,
|
||
std::pair<_T1, _T2>, bool>
|
||
{
|
||
private:
|
||
_Compare& _M_comp;
|
||
|
||
public:
|
||
_Lexicographic(_Compare& __comp) : _M_comp(__comp) { }
|
||
|
||
bool
|
||
operator()(const std::pair<_T1, _T2>& __p1,
|
||
const std::pair<_T1, _T2>& __p2) const
|
||
{
|
||
if (_M_comp(__p1.first, __p2.first))
|
||
return true;
|
||
|
||
if (_M_comp(__p2.first, __p1.first))
|
||
return false;
|
||
|
||
// Firsts are equal.
|
||
return __p1.second < __p2.second;
|
||
}
|
||
};
|
||
|
||
/** @brief Compare __a pair of types lexicographically, descending. */
|
||
template<typename _T1, typename _T2, typename _Compare>
|
||
class _LexicographicReverse : public std::binary_function<_T1, _T2, bool>
|
||
{
|
||
private:
|
||
_Compare& _M_comp;
|
||
|
||
public:
|
||
_LexicographicReverse(_Compare& __comp) : _M_comp(__comp) { }
|
||
|
||
bool
|
||
operator()(const std::pair<_T1, _T2>& __p1,
|
||
const std::pair<_T1, _T2>& __p2) const
|
||
{
|
||
if (_M_comp(__p2.first, __p1.first))
|
||
return true;
|
||
|
||
if (_M_comp(__p1.first, __p2.first))
|
||
return false;
|
||
|
||
// Firsts are equal.
|
||
return __p2.second < __p1.second;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @brief Splits several sorted sequences at a certain global __rank,
|
||
* resulting in a splitting point for each sequence.
|
||
* The sequences are passed via a sequence of random-access
|
||
* iterator pairs, none of the sequences may be empty. If there
|
||
* are several equal elements across the split, the ones on the
|
||
* __left side will be chosen from sequences with smaller number.
|
||
* @param __begin_seqs Begin of the sequence of iterator pairs.
|
||
* @param __end_seqs End of the sequence of iterator pairs.
|
||
* @param __rank The global rank to partition at.
|
||
* @param __begin_offsets A random-access __sequence __begin where the
|
||
* __result will be stored in. Each element of the sequence is an
|
||
* iterator that points to the first element on the greater part of
|
||
* the respective __sequence.
|
||
* @param __comp The ordering functor, defaults to std::less<_Tp>.
|
||
*/
|
||
template<typename _RanSeqs, typename _RankType, typename _RankIterator,
|
||
typename _Compare>
|
||
void
|
||
multiseq_partition(_RanSeqs __begin_seqs, _RanSeqs __end_seqs,
|
||
_RankType __rank,
|
||
_RankIterator __begin_offsets,
|
||
_Compare __comp = std::less<
|
||
typename std::iterator_traits<typename
|
||
std::iterator_traits<_RanSeqs>::value_type::
|
||
first_type>::value_type>()) // std::less<_Tp>
|
||
{
|
||
_GLIBCXX_CALL(__end_seqs - __begin_seqs)
|
||
|
||
typedef typename std::iterator_traits<_RanSeqs>::value_type::first_type
|
||
_It;
|
||
typedef typename std::iterator_traits<_RanSeqs>::difference_type
|
||
_SeqNumber;
|
||
typedef typename std::iterator_traits<_It>::difference_type
|
||
_DifferenceType;
|
||
typedef typename std::iterator_traits<_It>::value_type _ValueType;
|
||
|
||
_Lexicographic<_ValueType, _SeqNumber, _Compare> __lcomp(__comp);
|
||
_LexicographicReverse<_ValueType, _SeqNumber, _Compare> __lrcomp(__comp);
|
||
|
||
// Number of sequences, number of elements in total (possibly
|
||
// including padding).
|
||
_DifferenceType __m = std::distance(__begin_seqs, __end_seqs), __nn = 0,
|
||
__nmax, __n, __r;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
{
|
||
__nn += std::distance(__begin_seqs[__i].first,
|
||
__begin_seqs[__i].second);
|
||
_GLIBCXX_PARALLEL_ASSERT(
|
||
std::distance(__begin_seqs[__i].first,
|
||
__begin_seqs[__i].second) > 0);
|
||
}
|
||
|
||
if (__rank == __nn)
|
||
{
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
__begin_offsets[__i] = __begin_seqs[__i].second; // Very end.
|
||
// Return __m - 1;
|
||
return;
|
||
}
|
||
|
||
_GLIBCXX_PARALLEL_ASSERT(__m != 0);
|
||
_GLIBCXX_PARALLEL_ASSERT(__nn != 0);
|
||
_GLIBCXX_PARALLEL_ASSERT(__rank >= 0);
|
||
_GLIBCXX_PARALLEL_ASSERT(__rank < __nn);
|
||
|
||
_DifferenceType* __ns = new _DifferenceType[__m];
|
||
_DifferenceType* __a = new _DifferenceType[__m];
|
||
_DifferenceType* __b = new _DifferenceType[__m];
|
||
_DifferenceType __l;
|
||
|
||
__ns[0] = std::distance(__begin_seqs[0].first, __begin_seqs[0].second);
|
||
__nmax = __ns[0];
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
{
|
||
__ns[__i] = std::distance(__begin_seqs[__i].first,
|
||
__begin_seqs[__i].second);
|
||
__nmax = std::max(__nmax, __ns[__i]);
|
||
}
|
||
|
||
__r = __rd_log2(__nmax) + 1;
|
||
|
||
// Pad all lists to this length, at least as long as any ns[__i],
|
||
// equality iff __nmax = 2^__k - 1.
|
||
__l = (1ULL << __r) - 1;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
{
|
||
__a[__i] = 0;
|
||
__b[__i] = __l;
|
||
}
|
||
__n = __l / 2;
|
||
|
||
// Invariants:
|
||
// 0 <= __a[__i] <= __ns[__i], 0 <= __b[__i] <= __l
|
||
|
||
#define __S(__i) (__begin_seqs[__i].first)
|
||
|
||
// Initial partition.
|
||
std::vector<std::pair<_ValueType, _SeqNumber> > __sample;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
if (__n < __ns[__i]) //__sequence long enough
|
||
__sample.push_back(std::make_pair(__S(__i)[__n], __i));
|
||
__gnu_sequential::sort(__sample.begin(), __sample.end(), __lcomp);
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++) //conceptual infinity
|
||
if (__n >= __ns[__i]) //__sequence too short, conceptual infinity
|
||
__sample.push_back(
|
||
std::make_pair(__S(__i)[0] /*__dummy element*/, __i));
|
||
|
||
_DifferenceType __localrank = __rank / __l;
|
||
|
||
_SeqNumber __j;
|
||
for (__j = 0;
|
||
__j < __localrank && ((__n + 1) <= __ns[__sample[__j].second]);
|
||
++__j)
|
||
__a[__sample[__j].second] += __n + 1;
|
||
for (; __j < __m; __j++)
|
||
__b[__sample[__j].second] -= __n + 1;
|
||
|
||
// Further refinement.
|
||
while (__n > 0)
|
||
{
|
||
__n /= 2;
|
||
|
||
_SeqNumber __lmax_seq = -1; // to avoid warning
|
||
const _ValueType* __lmax = 0; // impossible to avoid the warning?
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
{
|
||
if (__a[__i] > 0)
|
||
{
|
||
if (!__lmax)
|
||
{
|
||
__lmax = &(__S(__i)[__a[__i] - 1]);
|
||
__lmax_seq = __i;
|
||
}
|
||
else
|
||
{
|
||
// Max, favor rear sequences.
|
||
if (!__comp(__S(__i)[__a[__i] - 1], *__lmax))
|
||
{
|
||
__lmax = &(__S(__i)[__a[__i] - 1]);
|
||
__lmax_seq = __i;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
_SeqNumber __i;
|
||
for (__i = 0; __i < __m; __i++)
|
||
{
|
||
_DifferenceType __middle = (__b[__i] + __a[__i]) / 2;
|
||
if (__lmax && __middle < __ns[__i] &&
|
||
__lcomp(std::make_pair(__S(__i)[__middle], __i),
|
||
std::make_pair(*__lmax, __lmax_seq)))
|
||
__a[__i] = std::min(__a[__i] + __n + 1, __ns[__i]);
|
||
else
|
||
__b[__i] -= __n + 1;
|
||
}
|
||
|
||
_DifferenceType __leftsize = 0;
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
__leftsize += __a[__i] / (__n + 1);
|
||
|
||
_DifferenceType __skew = __rank / (__n + 1) - __leftsize;
|
||
|
||
if (__skew > 0)
|
||
{
|
||
// Move to the left, find smallest.
|
||
std::priority_queue<std::pair<_ValueType, _SeqNumber>,
|
||
std::vector<std::pair<_ValueType, _SeqNumber> >,
|
||
_LexicographicReverse<_ValueType, _SeqNumber, _Compare> >
|
||
__pq(__lrcomp);
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
if (__b[__i] < __ns[__i])
|
||
__pq.push(std::make_pair(__S(__i)[__b[__i]], __i));
|
||
|
||
for (; __skew != 0 && !__pq.empty(); --__skew)
|
||
{
|
||
_SeqNumber __source = __pq.top().second;
|
||
__pq.pop();
|
||
|
||
__a[__source]
|
||
= std::min(__a[__source] + __n + 1, __ns[__source]);
|
||
__b[__source] += __n + 1;
|
||
|
||
if (__b[__source] < __ns[__source])
|
||
__pq.push(
|
||
std::make_pair(__S(__source)[__b[__source]], __source));
|
||
}
|
||
}
|
||
else if (__skew < 0)
|
||
{
|
||
// Move to the right, find greatest.
|
||
std::priority_queue<std::pair<_ValueType, _SeqNumber>,
|
||
std::vector<std::pair<_ValueType, _SeqNumber> >,
|
||
_Lexicographic<_ValueType, _SeqNumber, _Compare> >
|
||
__pq(__lcomp);
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
if (__a[__i] > 0)
|
||
__pq.push(std::make_pair(__S(__i)[__a[__i] - 1], __i));
|
||
|
||
for (; __skew != 0; ++__skew)
|
||
{
|
||
_SeqNumber __source = __pq.top().second;
|
||
__pq.pop();
|
||
|
||
__a[__source] -= __n + 1;
|
||
__b[__source] -= __n + 1;
|
||
|
||
if (__a[__source] > 0)
|
||
__pq.push(std::make_pair(
|
||
__S(__source)[__a[__source] - 1], __source));
|
||
}
|
||
}
|
||
}
|
||
|
||
// Postconditions:
|
||
// __a[__i] == __b[__i] in most cases, except when __a[__i] has been
|
||
// clamped because of having reached the boundary
|
||
|
||
// Now return the result, calculate the offset.
|
||
|
||
// Compare the keys on both edges of the border.
|
||
|
||
// Maximum of left edge, minimum of right edge.
|
||
_ValueType* __maxleft = 0;
|
||
_ValueType* __minright = 0;
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
{
|
||
if (__a[__i] > 0)
|
||
{
|
||
if (!__maxleft)
|
||
__maxleft = &(__S(__i)[__a[__i] - 1]);
|
||
else
|
||
{
|
||
// Max, favor rear sequences.
|
||
if (!__comp(__S(__i)[__a[__i] - 1], *__maxleft))
|
||
__maxleft = &(__S(__i)[__a[__i] - 1]);
|
||
}
|
||
}
|
||
if (__b[__i] < __ns[__i])
|
||
{
|
||
if (!__minright)
|
||
__minright = &(__S(__i)[__b[__i]]);
|
||
else
|
||
{
|
||
// Min, favor fore sequences.
|
||
if (__comp(__S(__i)[__b[__i]], *__minright))
|
||
__minright = &(__S(__i)[__b[__i]]);
|
||
}
|
||
}
|
||
}
|
||
|
||
_SeqNumber __seq = 0;
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
__begin_offsets[__i] = __S(__i) + __a[__i];
|
||
|
||
delete[] __ns;
|
||
delete[] __a;
|
||
delete[] __b;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief Selects the element at a certain global __rank from several
|
||
* sorted sequences.
|
||
*
|
||
* The sequences are passed via a sequence of random-access
|
||
* iterator pairs, none of the sequences may be empty.
|
||
* @param __begin_seqs Begin of the sequence of iterator pairs.
|
||
* @param __end_seqs End of the sequence of iterator pairs.
|
||
* @param __rank The global rank to partition at.
|
||
* @param __offset The rank of the selected element in the global
|
||
* subsequence of elements equal to the selected element. If the
|
||
* selected element is unique, this number is 0.
|
||
* @param __comp The ordering functor, defaults to std::less.
|
||
*/
|
||
template<typename _Tp, typename _RanSeqs, typename _RankType,
|
||
typename _Compare>
|
||
_Tp
|
||
multiseq_selection(_RanSeqs __begin_seqs, _RanSeqs __end_seqs,
|
||
_RankType __rank,
|
||
_RankType& __offset, _Compare __comp = std::less<_Tp>())
|
||
{
|
||
_GLIBCXX_CALL(__end_seqs - __begin_seqs)
|
||
|
||
typedef typename std::iterator_traits<_RanSeqs>::value_type::first_type
|
||
_It;
|
||
typedef typename std::iterator_traits<_RanSeqs>::difference_type
|
||
_SeqNumber;
|
||
typedef typename std::iterator_traits<_It>::difference_type
|
||
_DifferenceType;
|
||
|
||
_Lexicographic<_Tp, _SeqNumber, _Compare> __lcomp(__comp);
|
||
_LexicographicReverse<_Tp, _SeqNumber, _Compare> __lrcomp(__comp);
|
||
|
||
// Number of sequences, number of elements in total (possibly
|
||
// including padding).
|
||
_DifferenceType __m = std::distance(__begin_seqs, __end_seqs);
|
||
_DifferenceType __nn = 0;
|
||
_DifferenceType __nmax, __n, __r;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
__nn += std::distance(__begin_seqs[__i].first,
|
||
__begin_seqs[__i].second);
|
||
|
||
if (__m == 0 || __nn == 0 || __rank < 0 || __rank >= __nn)
|
||
{
|
||
// result undefined if there is no data or __rank is outside bounds
|
||
throw std::exception();
|
||
}
|
||
|
||
|
||
_DifferenceType* __ns = new _DifferenceType[__m];
|
||
_DifferenceType* __a = new _DifferenceType[__m];
|
||
_DifferenceType* __b = new _DifferenceType[__m];
|
||
_DifferenceType __l;
|
||
|
||
__ns[0] = std::distance(__begin_seqs[0].first, __begin_seqs[0].second);
|
||
__nmax = __ns[0];
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
{
|
||
__ns[__i] = std::distance(__begin_seqs[__i].first,
|
||
__begin_seqs[__i].second);
|
||
__nmax = std::max(__nmax, __ns[__i]);
|
||
}
|
||
|
||
__r = __rd_log2(__nmax) + 1;
|
||
|
||
// Pad all lists to this length, at least as long as any ns[__i],
|
||
// equality iff __nmax = 2^__k - 1
|
||
__l = __round_up_to_pow2(__r) - 1;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
{
|
||
__a[__i] = 0;
|
||
__b[__i] = __l;
|
||
}
|
||
__n = __l / 2;
|
||
|
||
// Invariants:
|
||
// 0 <= __a[__i] <= __ns[__i], 0 <= __b[__i] <= __l
|
||
|
||
#define __S(__i) (__begin_seqs[__i].first)
|
||
|
||
// Initial partition.
|
||
std::vector<std::pair<_Tp, _SeqNumber> > __sample;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
if (__n < __ns[__i])
|
||
__sample.push_back(std::make_pair(__S(__i)[__n], __i));
|
||
__gnu_sequential::sort(__sample.begin(), __sample.end(),
|
||
__lcomp, sequential_tag());
|
||
|
||
// Conceptual infinity.
|
||
for (_SeqNumber __i = 0; __i < __m; __i++)
|
||
if (__n >= __ns[__i])
|
||
__sample.push_back(
|
||
std::make_pair(__S(__i)[0] /*__dummy element*/, __i));
|
||
|
||
_DifferenceType __localrank = __rank / __l;
|
||
|
||
_SeqNumber __j;
|
||
for (__j = 0;
|
||
__j < __localrank && ((__n + 1) <= __ns[__sample[__j].second]);
|
||
++__j)
|
||
__a[__sample[__j].second] += __n + 1;
|
||
for (; __j < __m; ++__j)
|
||
__b[__sample[__j].second] -= __n + 1;
|
||
|
||
// Further refinement.
|
||
while (__n > 0)
|
||
{
|
||
__n /= 2;
|
||
|
||
const _Tp* __lmax = 0;
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
{
|
||
if (__a[__i] > 0)
|
||
{
|
||
if (!__lmax)
|
||
__lmax = &(__S(__i)[__a[__i] - 1]);
|
||
else
|
||
{
|
||
if (__comp(*__lmax, __S(__i)[__a[__i] - 1])) //max
|
||
__lmax = &(__S(__i)[__a[__i] - 1]);
|
||
}
|
||
}
|
||
}
|
||
|
||
_SeqNumber __i;
|
||
for (__i = 0; __i < __m; __i++)
|
||
{
|
||
_DifferenceType __middle = (__b[__i] + __a[__i]) / 2;
|
||
if (__lmax && __middle < __ns[__i]
|
||
&& __comp(__S(__i)[__middle], *__lmax))
|
||
__a[__i] = std::min(__a[__i] + __n + 1, __ns[__i]);
|
||
else
|
||
__b[__i] -= __n + 1;
|
||
}
|
||
|
||
_DifferenceType __leftsize = 0;
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
__leftsize += __a[__i] / (__n + 1);
|
||
|
||
_DifferenceType __skew = __rank / (__n + 1) - __leftsize;
|
||
|
||
if (__skew > 0)
|
||
{
|
||
// Move to the left, find smallest.
|
||
std::priority_queue<std::pair<_Tp, _SeqNumber>,
|
||
std::vector<std::pair<_Tp, _SeqNumber> >,
|
||
_LexicographicReverse<_Tp, _SeqNumber, _Compare> >
|
||
__pq(__lrcomp);
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
if (__b[__i] < __ns[__i])
|
||
__pq.push(std::make_pair(__S(__i)[__b[__i]], __i));
|
||
|
||
for (; __skew != 0 && !__pq.empty(); --__skew)
|
||
{
|
||
_SeqNumber __source = __pq.top().second;
|
||
__pq.pop();
|
||
|
||
__a[__source]
|
||
= std::min(__a[__source] + __n + 1, __ns[__source]);
|
||
__b[__source] += __n + 1;
|
||
|
||
if (__b[__source] < __ns[__source])
|
||
__pq.push(
|
||
std::make_pair(__S(__source)[__b[__source]], __source));
|
||
}
|
||
}
|
||
else if (__skew < 0)
|
||
{
|
||
// Move to the right, find greatest.
|
||
std::priority_queue<std::pair<_Tp, _SeqNumber>,
|
||
std::vector<std::pair<_Tp, _SeqNumber> >,
|
||
_Lexicographic<_Tp, _SeqNumber, _Compare> > __pq(__lcomp);
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
if (__a[__i] > 0)
|
||
__pq.push(std::make_pair(__S(__i)[__a[__i] - 1], __i));
|
||
|
||
for (; __skew != 0; ++__skew)
|
||
{
|
||
_SeqNumber __source = __pq.top().second;
|
||
__pq.pop();
|
||
|
||
__a[__source] -= __n + 1;
|
||
__b[__source] -= __n + 1;
|
||
|
||
if (__a[__source] > 0)
|
||
__pq.push(std::make_pair(
|
||
__S(__source)[__a[__source] - 1], __source));
|
||
}
|
||
}
|
||
}
|
||
|
||
// Postconditions:
|
||
// __a[__i] == __b[__i] in most cases, except when __a[__i] has been
|
||
// clamped because of having reached the boundary
|
||
|
||
// Now return the result, calculate the offset.
|
||
|
||
// Compare the keys on both edges of the border.
|
||
|
||
// Maximum of left edge, minimum of right edge.
|
||
bool __maxleftset = false, __minrightset = false;
|
||
|
||
// Impossible to avoid the warning?
|
||
_Tp __maxleft, __minright;
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
{
|
||
if (__a[__i] > 0)
|
||
{
|
||
if (!__maxleftset)
|
||
{
|
||
__maxleft = __S(__i)[__a[__i] - 1];
|
||
__maxleftset = true;
|
||
}
|
||
else
|
||
{
|
||
// Max.
|
||
if (__comp(__maxleft, __S(__i)[__a[__i] - 1]))
|
||
__maxleft = __S(__i)[__a[__i] - 1];
|
||
}
|
||
}
|
||
if (__b[__i] < __ns[__i])
|
||
{
|
||
if (!__minrightset)
|
||
{
|
||
__minright = __S(__i)[__b[__i]];
|
||
__minrightset = true;
|
||
}
|
||
else
|
||
{
|
||
// Min.
|
||
if (__comp(__S(__i)[__b[__i]], __minright))
|
||
__minright = __S(__i)[__b[__i]];
|
||
}
|
||
}
|
||
}
|
||
|
||
// Minright is the __splitter, in any case.
|
||
|
||
if (!__maxleftset || __comp(__minright, __maxleft))
|
||
{
|
||
// Good luck, everything is split unambiguously.
|
||
__offset = 0;
|
||
}
|
||
else
|
||
{
|
||
// We have to calculate an offset.
|
||
__offset = 0;
|
||
|
||
for (_SeqNumber __i = 0; __i < __m; ++__i)
|
||
{
|
||
_DifferenceType lb
|
||
= std::lower_bound(__S(__i), __S(__i) + __ns[__i],
|
||
__minright,
|
||
__comp) - __S(__i);
|
||
__offset += __a[__i] - lb;
|
||
}
|
||
}
|
||
|
||
delete[] __ns;
|
||
delete[] __a;
|
||
delete[] __b;
|
||
|
||
return __minright;
|
||
}
|
||
}
|
||
|
||
#undef __S
|
||
|
||
#endif /* _GLIBCXX_PARALLEL_MULTISEQ_SELECTION_H */
|