Stxxl  1.4.0
include/stxxl/bits/algo/inmemsort.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines