00001
00025 #ifndef GALOIS_RUNTIME_RANGE_H
00026 #define GALOIS_RUNTIME_RANGE_H
00027
00028 #include "Galois/gstl.h"
00029
00030 #include "Galois/Runtime/ActiveThreads.h"
00031 #include "Galois/Runtime/ll/TID.h"
00032
00033 #include <iterator>
00034
00035 namespace Galois {
00036 namespace Runtime {
00037
00038
00039
00040 template<typename T>
00041 class LocalRange {
00042 T* container;
00043
00044 public:
00045 typedef typename T::iterator iterator;
00046 typedef typename T::local_iterator local_iterator;
00047 typedef iterator block_iterator;
00048 typedef typename std::iterator_traits<iterator>::value_type value_type;
00049
00050 LocalRange(T& c): container(&c) { }
00051
00052 iterator begin() const { return container->begin(); }
00053 iterator end() const { return container->end(); }
00054
00055 std::pair<block_iterator, block_iterator> block_pair() const {
00056 return Galois::block_range(begin(), end(), LL::getTID(), activeThreads);
00057 }
00058
00059 std::pair<local_iterator, local_iterator> local_pair() const {
00060 return std::make_pair(container->local_begin(), container->local_end());
00061 }
00062
00063 local_iterator local_begin() const { return container->local_begin(); }
00064 local_iterator local_end() const { return container->local_end(); }
00065
00066 block_iterator block_begin() const { return block_pair().first; }
00067 block_iterator block_end() const { return block_pair().second; }
00068 };
00069
00070 template<typename T>
00071 inline LocalRange<T> makeLocalRange(T& obj) { return LocalRange<T>(obj); }
00072
00073 template<typename IterTy>
00074 class StandardRange {
00075 IterTy ii, ei;
00076 public:
00077 typedef IterTy iterator;
00078 typedef iterator local_iterator;
00079 typedef iterator block_iterator;
00080
00081 typedef typename std::iterator_traits<IterTy>::value_type value_type;
00082
00083 StandardRange(IterTy b, IterTy e): ii(b), ei(e) { }
00084
00085 iterator begin() const { return ii; }
00086 iterator end() const { return ei; }
00087
00088 std::pair<block_iterator, block_iterator> block_pair() const {
00089 return Galois::block_range(ii, ei, LL::getTID(), activeThreads);
00090 }
00091
00092 std::pair<local_iterator, local_iterator> local_pair() const {
00093 return block_pair();
00094 }
00095
00096 local_iterator local_begin() const { return block_begin(); }
00097 local_iterator local_end() const { return block_end(); }
00098
00099 block_iterator block_begin() const { return block_pair().first; }
00100
00101 block_iterator block_end() const { return block_pair().second; }
00102 };
00103
00104 template<typename IterTy>
00105 inline StandardRange<IterTy> makeStandardRange(IterTy begin, IterTy end) {
00106 return StandardRange<IterTy>(begin, end);
00107 }
00108
00109 }
00110 }
00111
00112 #endif