#pragma once #include #include "iterators/BaseIterator.h" template class BFSIterator : public BaseIterator { public: explicit BFSIterator(T* ptr) : BaseIterator(ptr) { if (!this->current()) return; for (auto& it : this->current()->children()) q.push({it.get(), 1}); } IIterator& operator++() override { advance(); return *this; } protected: std::queue> q; void advance() { if (q.empty()) { this->set_current(nullptr); return; } auto& [node, lvl] = q.front(); q.pop(); this->set_current(node); this->set_level(lvl); for (auto& it : this->current()->children()) q.push({it.get(), lvl + 1}); } };