/** * @file iterator.hpp * @brief J Library Iterator ヘッダファイル。 * @copyright 2001 - 2024 Nomura Kei * @depends * j.hpp */ #ifndef J_UTIL_ITERATOR_HPP #define J_UTIL_ITERATOR_HPP #include <vector> #include <algorithm> #include <j.hpp> namespace j { namespace util { template <typename T> class Iterator { private: typename std::vector<T>::const_iterator current; typename std::vector<T>::const_iterator end; public: Iterator(typename std::vector<T>::const_iterator start, typename std::vector<T>::const_iterator end) : current(start), end(end) {} virtual ~Iterator() = default; /** * 反復処理でさらに要素がある場合に true を返します。 * * @return 反復処理でさらに要素がある場合は true */ virtual bool hasNext() const { return (current != end); } /** * 反復処理で次の要素を返します。 * * @return 反復処理での次の要素 */ virtual T &next() { if (!hasNext()) { // TODO } return const_cast<T &>(*current++); } T &operator*() const { return const_cast<T &>(*current); } Iterator &operator++() { current++; return *this; } Iterator operator++(int) { Iterator tmp = *this; current++; return tmp; } bool operator==(const Iterator &ite) const { return (current == ite.current); } bool operator!=(const Iterator &ite) const { return (current != ite.current); } using iterator_category = std::input_iterator_tag; using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T *; using reference = T &; }; } // namespace util } // namespace j #endif // J_UTIL_COLLECTION_HPP