/ erasure_code / utils.h
utils.h
 1  #ifndef UTILS_H_
 2  #define UTILS_H_
 3  
 4  #include <utility>
 5  #include <cstddef>
 6  #include <type_traits>
 7  
 8  // turn a pair of iterators into a range
 9  template<typename T>
10  class iter_pair {
11      T a, b;
12      typedef typename std::remove_reference<decltype(**static_cast<T*>(nullptr))>::type value_type;
13  public:
14      iter_pair(const T& _a, const T& _b) : a(_a), b(_b) { }
15      iter_pair(T&& _a, T&& _b) : a(std::move(_a)), b(std::move(_b)) { }
16      T begin() const { return a; }
17      T end() const { return b; }
18  
19      // for random access iterators
20      value_type& operator[](std::size_t ix) { return *(a + ix); }
21      const value_type& operator[](std::size_t ix) const { return *(a + ix); }
22      std::size_t size() const { return b - a; }
23  };
24  
25  template<typename T>
26  iter_pair<T> make_iter_pair(const T& a, const T& b) {
27      return iter_pair<T>(a, b);
28  }
29  template<typename T>
30  iter_pair<T> make_iter_pair(T&& a, T&& b) {
31      return iter_pair<T>(std::move(a), std::move(b));
32  }
33  
34  #endif