Stxxl
1.4.0
|
00001 /*************************************************************************** 00002 * include/stxxl/bits/algo/inmemsort.h 00003 * 00004 * Part of the STXXL. See http://stxxl.sourceforge.net 00005 * 00006 * Copyright (C) 2003 Roman Dementiev <dementiev@mpi-sb.mpg.de> 00007 * Copyright (C) 2010 Andreas Beckmann <beckmann@cs.uni-frankfurt.de> 00008 * 00009 * Distributed under the Boost Software License, Version 1.0. 00010 * (See accompanying file LICENSE_1_0.txt or copy at 00011 * http://www.boost.org/LICENSE_1_0.txt) 00012 **************************************************************************/ 00013 00014 #ifndef STXXL_IN_MEMORY_SORT_HEADER 00015 #define STXXL_IN_MEMORY_SORT_HEADER 00016 00017 #include <stxxl/bits/namespace.h> 00018 #include <stxxl/bits/common/simple_vector.h> 00019 #include <stxxl/bits/io/request_operations.h> 00020 #include <stxxl/bits/algo/adaptor.h> 00021 #include <stxxl/bits/mng/adaptor.h> 00022 #include <stxxl/bits/parallel.h> 00023 00024 #include <algorithm> 00025 00026 00027 __STXXL_BEGIN_NAMESPACE 00028 00029 template <typename ExtIterator_, typename StrictWeakOrdering_> 00030 void stl_in_memory_sort(ExtIterator_ first, ExtIterator_ last, StrictWeakOrdering_ cmp) 00031 { 00032 typedef typename ExtIterator_::vector_type::value_type value_type; 00033 typedef typename ExtIterator_::block_type block_type; 00034 00035 STXXL_VERBOSE("stl_in_memory_sort, range: " << (last - first)); 00036 first.flush(); 00037 unsigned_type nblocks = last.bid() - first.bid() + (last.block_offset() ? 1 : 0); 00038 simple_vector<block_type> blocks(nblocks); 00039 simple_vector<request_ptr> reqs(nblocks); 00040 unsigned_type i; 00041 00042 for (i = 0; i < nblocks; ++i) 00043 reqs[i] = blocks[i].read(*(first.bid() + i)); 00044 00045 00046 wait_all(reqs.begin(), nblocks); 00047 00048 unsigned_type last_block_correction = last.block_offset() ? (block_type::size - last.block_offset()) : 0; 00049 check_sort_settings(); 00050 potentially_parallel:: 00051 sort(make_element_iterator(blocks.begin(), first.block_offset()), 00052 make_element_iterator(blocks.begin(), nblocks * block_type::size - last_block_correction), 00053 cmp); 00054 00055 for (i = 0; i < nblocks; ++i) 00056 reqs[i] = blocks[i].write(*(first.bid() + i)); 00057 00058 wait_all(reqs.begin(), nblocks); 00059 } 00060 00061 00062 __STXXL_END_NAMESPACE 00063 00064 #endif // !STXXL_IN_MEMORY_SORT_HEADER