#pragma once #include #include #include #include /** Numeric range iterator, used to represent a half-closed interval [begin, end). * In conjunction with std::reverse_iterator allows for forward and backward iteration * over corresponding interval. */ namespace ext { template using range_iterator = boost::counting_iterator; /** Range-based for loop adapter for (reverse_)range_iterator. * By and large should be in conjunction with ext::range and ext::reverse_range. */ template struct range_wrapper { using value_type = typename std::remove_reference::type; using iterator = range_iterator; value_type begin_; value_type end_; iterator begin() const { return iterator(begin_); } iterator end() const { return iterator(end_); } }; /** Constructs range_wrapper for forward-iteration over [begin, end) in range-based for loop. * Usage example: * for (const auto i : ext::range(0, 4)) print(i); * Output: * 0 1 2 3 */ template inline range_wrapper::type> range(T1 begin, T2 end) { using common_type = typename std::common_type::type; return { static_cast(begin), static_cast(end) }; } }