blob: f6eda0e105d4821752d343b8a9567d2d8787904f [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.
#ifndef COMPONENTS_QUERY_TILES_INTERNAL_TILE_ITERATOR_H_
#define COMPONENTS_QUERY_TILES_INTERNAL_TILE_ITERATOR_H_
#include <queue>
#include <utility>
#include <vector>
namespace query_tiles {
struct Tile;
struct TileGroup;
// Breadth first search iterator that can iterate through first few levels or
// everything in the tile tree structure. During iteration, tiles can't be
// changed or deleted within the lifecycle of the iterator.
// Example usage:
// void IterateGroup(const TileGroup& group) {
// TileIterator it(group, TileIterator::kAllTiles);
// while (it->HasNext()) {
// const auto* tile = it->Next();
// // Use tile data.
// }
// }
//
class TileIterator {
public:
// Pass to |levels_| to iterates through all tiles.
static constexpr int kAllTiles = -1;
// Constructs an iterator that iterates first few |levels| of the |tiles|.
// If |levels| is 0, only root tiles in |tiles| will be iterated.
TileIterator(std::vector<const Tile*> tiles, int levels);
// Constructs an iterator for a tile group.
TileIterator(const TileGroup& tile_group, int levels);
// Returns whether there are any remaining elements.
bool HasNext() const;
// Returns the next tile and moves to the next tile. When the iterator is
// empty, return nullptr.
const Tile* Next();
~TileIterator();
TileIterator(const TileIterator&) = delete;
TileIterator operator=(const TileIterator&) = delete;
private:
using TileLevelPair = std::pair<int, const Tile*>;
using TilesQueue = std::queue<TileLevelPair>;
// Adds an element to |tiles_queue_| if |tile| is valid.
void MaybeAddToQueue(int level, const Tile* tile);
TilesQueue tiles_queue_;
// The number of levels of tiles to iterate on.
const int levels_;
};
} // namespace query_tiles
#endif // COMPONENTS_QUERY_TILES_INTERNAL_TILE_ITERATOR_H_