#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 : BaseIterator::current->children()) q.push(it.get()); } IIterator& operator++() override { advance(); return *this; } virtual size_t level() const { return level_; } protected: std::queue q; size_t level_; void advance() { if (q.empty()) { this->current = nullptr; return; } this->current = q.front(); q.pop(); for (auto& it : this->current->children()) q.push(it.get()); } };