#pragma once #include #include "iterators/BaseIterator.h" template class DFSIterator : public BaseIterator { public: explicit DFSIterator(T* ptr) : BaseIterator(ptr) { if (!this->current) return; for (auto& it : BaseIterator::current->children()) s.push(it.get()); } IIterator& operator++() override { advance(); return *this; } virtual size_t level() const { return level_; } protected: std::stack s; size_t level_; void advance() { if (s.empty()) { this->current = nullptr; return; } this->current = s.top(); s.pop(); for (auto& it : this->current->children()) s.push(it.get()); } };