blob: ac560ee3e9c371bf10759e0c459a21ad971edf94 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/query_tiles/internal/tile_iterator.h"
#include <ostream>
#include "base/check_op.h"
#include "components/query_tiles/internal/tile_group.h"
#include "components/query_tiles/tile.h"
namespace query_tiles {
TileIterator::TileIterator(std::vector<const Tile*> tiles, int levels)
: levels_(levels) {
DCHECK(levels_ >= 0 || levels_ == kAllTiles);
for (const auto* tile : tiles)
MaybeAddToQueue(0, tile);
}
TileIterator::TileIterator(const TileGroup& tile_group, int levels)
: levels_(levels) {
DCHECK(levels_ >= 0 || levels_ == kAllTiles);
for (const auto& tile : tile_group.tiles)
MaybeAddToQueue(0, tile.get());
}
TileIterator::~TileIterator() = default;
bool TileIterator::HasNext() const {
return !tiles_queue_.empty();
}
const Tile* TileIterator::Next() {
if (!HasNext())
return nullptr;
TileLevelPair tile = tiles_queue_.front();
tiles_queue_.pop();
// Add subtiles into the queue if next level is still needed.
if (levels_ == kAllTiles || tile.first < levels_) {
for (const auto& subtile : tile.second->sub_tiles)
MaybeAddToQueue(tile.first + 1, subtile.get());
}
return tile.second;
}
void TileIterator::MaybeAddToQueue(int level, const Tile* tile) {
DCHECK_GE(level, 0) << "level should be non negative.";
if (!tile)
return;
tiles_queue_.push(TileLevelPair(level, tile));
}
} // namespace query_tiles