/ 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