1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #pragma once
- /**
- * Iterator interface
- * \tparam T type of the value that is iterated
- * \tparam I type of the iterator subclass
- */
- template<typename T, typename I> class Iterator
- {
- public:
- virtual ~Iterator()
- {
- static_assert(std::is_base_of<Iterator, I>::value,
- "Type Argument I must be an implementation of Iterator");
- }
- virtual bool hasNext()
- {
- return (bool)next();
- }
- virtual I next() = 0;
- virtual operator bool() = 0;
- virtual I& operator++() //! prefix
- {
- *(I*)this = next();
- return *(I*)this;
- }
- virtual I operator++(int) //! postfix
- {
- I tmp(*(I*)this);
- operator++();
- return tmp;
- }
- virtual T val() = 0;
- virtual void set(T val) = 0;
- virtual void remove() = 0;
- operator T()
- {
- return val();
- }
- virtual T operator->()
- {
- return val();
- }
- virtual T operator*()
- {
- return val();
- }
- };
|