| 853 | }; |
| 854 | |
| 855 | class range_iterator final { |
| 856 | numeric m_step, m_index; |
| 857 | |
| 858 | public: |
| 859 | range_iterator() = delete; |
| 860 | |
| 861 | explicit range_iterator(numeric step, numeric index) : m_step(std::move(step)), m_index(std::move(index)) {} |
| 862 | |
| 863 | range_iterator(const range_iterator &) = default; |
| 864 | |
| 865 | range_iterator(range_iterator &&) noexcept = default; |
| 866 | |
| 867 | range_iterator &operator=(const range_iterator &) = default; |
| 868 | |
| 869 | bool operator==(const range_iterator &it) const |
| 870 | { |
| 871 | return m_index == it.m_index; |
| 872 | } |
| 873 | |
| 874 | bool operator!=(const range_iterator &it) const |
| 875 | { |
| 876 | return m_index < it.m_index; |
| 877 | } |
| 878 | |
| 879 | range_iterator &operator++() |
| 880 | { |
| 881 | m_index = m_index + m_step; |
| 882 | return *this; |
| 883 | } |
| 884 | |
| 885 | numeric operator*() const |
| 886 | { |
| 887 | return m_index; |
| 888 | } |
| 889 | }; |
| 890 | |
| 891 | class range_type final { |
| 892 | numeric m_start, m_stop, m_step; |