Iterator.h 986 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #pragma once
  2. /**
  3. * Iterator interface
  4. * \tparam T type of the value that is iterated
  5. * \tparam I type of the iterator subclass
  6. */
  7. template<typename T, typename I> class Iterator
  8. {
  9. public:
  10. virtual ~Iterator()
  11. {
  12. static_assert(std::is_base_of<Iterator, I>::value,
  13. "Type Argument I must be an implementation of Iterator");
  14. }
  15. virtual bool hasNext()
  16. {
  17. return (bool)next();
  18. }
  19. virtual I next() = 0;
  20. virtual operator bool() = 0;
  21. virtual I& operator++() //! prefix
  22. {
  23. *(I*)this = next();
  24. return *(I*)this;
  25. }
  26. virtual I operator++(int) //! postfix
  27. {
  28. I tmp(*(I*)this);
  29. operator++();
  30. return tmp;
  31. }
  32. virtual T val() = 0;
  33. virtual void set(T val) = 0;
  34. virtual void remove() = 0;
  35. operator T()
  36. {
  37. return val();
  38. }
  39. virtual T operator->()
  40. {
  41. return val();
  42. }
  43. virtual T operator*()
  44. {
  45. return val();
  46. }
  47. };