#pragma once #include #include "ifaces/IIterator.h" /// \brief Базовый итератор. /// \tparam T Тип итерируемого элемента. /// Предоставляет базовую реализацию методов для работы с итерируемыми объектами. /// Возвращает объект-прокси, мимикрирующий под итерируемый элемент. Позволяет использовать /// распаковку структуры для получения уровня элемента в поддереве. template class BaseIterator : public IIterator { public: explicit BaseIterator(T* ptr) : proxy{ptr, 0} {} struct Proxy { T* e; size_t level; T& operator*() const { return *e; } T* operator->() const { return e; } }; Proxy& operator*() { return proxy; } T* operator->() const override { return current(); } operator const T*() const { return current(); } operator T&() const { return *current(); } operator T*() const { return current(); } bool operator!=(const IIterator& other) const override { const T* other_current = other; return current() != other_current; } protected: T* current() const { return proxy.e; } void set_current(T* e) { proxy.e = e; } size_t level() const { return proxy.level; } void set_level(size_t level) { proxy.level = level; } private: Proxy proxy; };