00001
00023 #ifndef GALOIS_GSTL_H
00024 #define GALOIS_GSTL_H
00025
00026 #include <algorithm>
00027 #include <iterator>
00028 #include <utility>
00029
00030 namespace Galois {
00031
00032 template<typename IterTy, class Distance>
00033 IterTy safe_advance_dispatch(IterTy b, IterTy e, Distance n, std::random_access_iterator_tag) {
00034 if (std::distance(b,e) < n)
00035 return b + n;
00036 else
00037 return e;
00038 }
00039
00040 template<typename IterTy, class Distance>
00041 IterTy safe_advance_dispatch(IterTy b, IterTy e, Distance n, std::input_iterator_tag) {
00042 while (b != e && n--)
00043 ++b;
00044 return b;
00045 }
00046
00050 template<typename IterTy, class Distance>
00051 IterTy safe_advance(IterTy b, IterTy e, Distance n) {
00052 typename std::iterator_traits<IterTy>::iterator_category category;
00053 return safe_advance_dispatch(b,e,n,category);
00054 }
00055
00056
00061 template<typename IterTy>
00062 IterTy split_range(IterTy b, IterTy e) {
00063 std::advance(b, (std::distance(b,e) + 1) / 2);
00064 return b;
00065 }
00066
00071 template<typename IterTy>
00072 std::pair<IterTy, IterTy> block_range(IterTy b, IterTy e, unsigned id, unsigned num) {
00073 unsigned int dist = std::distance(b, e);
00074 unsigned int numper = std::max((dist + num - 1) / num, 1U);
00075 unsigned int A = std::min(numper * id, dist);
00076 unsigned int B = std::min(numper * (id + 1), dist);
00077 std::advance(b, A);
00078 if (dist != B) {
00079 e = b;
00080 std::advance(e, B - A);
00081 }
00082 return std::make_pair(b,e);
00083 }
00084
00085
00087 template<class InputIterator>
00088 void uninitialized_destroy ( InputIterator first, InputIterator last )
00089 {
00090 typedef typename std::iterator_traits<InputIterator>::value_type T;
00091 for (; first!=last; ++first)
00092 (&*first)->~T();
00093 }
00094
00095 }
00096 #endif