Stxxl
1.2.1
|
00001 /*************************************************************************** 00002 * include/stxxl/bits/algo/run_cursor.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 * 00008 * Distributed under the Boost Software License, Version 1.0. 00009 * (See accompanying file LICENSE_1_0.txt or copy at 00010 * http://www.boost.org/LICENSE_1_0.txt) 00011 **************************************************************************/ 00012 00013 #ifndef STXXL_RUN_CURSOR_HEADER 00014 #define STXXL_RUN_CURSOR_HEADER 00015 00016 #include <stxxl/bits/common/utils.h> 00017 00018 00019 __STXXL_BEGIN_NAMESPACE 00020 00021 template <typename block_type> 00022 struct run_cursor 00023 { 00024 unsigned pos; 00025 block_type * buffer; 00026 00027 run_cursor() : pos(0), buffer(NULL) { } 00028 00029 inline const typename block_type::type & current() const 00030 { 00031 return (*buffer)[pos]; 00032 } 00033 inline void operator ++ (int) 00034 { 00035 pos++; 00036 } 00037 }; 00038 00039 #ifdef STXXL_SORT_SINGLE_PREFETCHER 00040 00041 template <typename must_be_void = void> 00042 struct have_prefetcher 00043 { 00044 static void * untyped_prefetcher; 00045 }; 00046 00047 #endif 00048 00049 template <typename block_type, 00050 typename prefetcher_type_> 00051 struct run_cursor2 : public run_cursor<block_type> 00052 #ifdef STXXL_SORT_SINGLE_PREFETCHER 00053 , public have_prefetcher<> 00054 #endif 00055 { 00056 typedef prefetcher_type_ prefetcher_type; 00057 typedef run_cursor2<block_type, prefetcher_type> _Self; 00058 typedef typename block_type::value_type value_type; 00059 00060 00061 using run_cursor<block_type>::pos; 00062 using run_cursor<block_type>::buffer; 00063 00064 #ifdef STXXL_SORT_SINGLE_PREFETCHER 00065 static prefetcher_type * const prefetcher() // sorry, a hack 00066 { 00067 return reinterpret_cast<prefetcher_type *>(untyped_prefetcher); 00068 } 00069 static void set_prefetcher(prefetcher_type * pfptr) 00070 { 00071 untyped_prefetcher = pfptr; 00072 } 00073 run_cursor2() { } 00074 #else 00075 prefetcher_type * prefetcher_; 00076 prefetcher_type * & prefetcher() // sorry, a hack 00077 { 00078 return prefetcher_; 00079 } 00080 00081 run_cursor2() { } 00082 run_cursor2(prefetcher_type * p) : prefetcher_(p) { } 00083 #endif 00084 00085 inline bool empty() const 00086 { 00087 return (pos >= block_type::size); 00088 } 00089 inline void operator ++ (int); 00090 inline void make_inf() 00091 { 00092 pos = block_type::size; 00093 } 00094 }; 00095 00096 #ifdef STXXL_SORT_SINGLE_PREFETCHER 00097 template <typename must_be_void> 00098 void * have_prefetcher<must_be_void>::untyped_prefetcher = NULL; 00099 #endif 00100 00101 template <typename block_type, 00102 typename prefetcher_type> 00103 void run_cursor2<block_type, prefetcher_type>::operator ++ (int) 00104 { 00105 assert(!empty()); 00106 pos++; 00107 if (UNLIKELY(pos >= block_type::size)) 00108 { 00109 if (prefetcher()->block_consumed(buffer)) 00110 pos = 0; 00111 } 00112 } 00113 00114 00115 template <typename block_type> 00116 struct run_cursor_cmp 00117 { 00118 typedef run_cursor<block_type> cursor_type; 00119 /* 00120 inline bool operator () (const cursor_type & a, const cursor_type & b) // greater or equal 00121 { 00122 return !((*a.buffer)[a.pos] < (*b.buffer)[b.pos]); 00123 }*/ 00124 }; 00125 00126 __STXXL_END_NAMESPACE 00127 00128 00129 #endif // !STXXL_RUN_CURSOR_HEADER