blob: 5f7d6d649909d79734bcc264676003d782c4ca67 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/service/surfaces/referenced_surface_tracker.h"
#include "base/check.h"
namespace viz {
void GetSurfaceReferenceDifference(
const SurfaceId& parent_surface_id,
const base::flat_set<SurfaceId>& old_referenced_surfaces,
const base::flat_set<SurfaceId>& new_referenced_surfaces,
std::vector<SurfaceReference>* references_to_add,
std::vector<SurfaceReference>* references_to_remove) {
DCHECK(parent_surface_id.is_valid());
auto old_it = old_referenced_surfaces.begin();
auto old_end = old_referenced_surfaces.end();
auto new_it = new_referenced_surfaces.begin();
auto new_end = new_referenced_surfaces.end();
// Do a linear walk through both old and new references to compute added and
// removed entries.
while (old_it != old_end || new_it != new_end) {
if (old_it == old_end) {
references_to_add->push_back(
SurfaceReference(parent_surface_id, *new_it++));
} else if (new_it == new_end) {
references_to_remove->push_back(
SurfaceReference(parent_surface_id, *old_it++));
} else if (*old_it < *new_it) {
references_to_remove->push_back(
SurfaceReference(parent_surface_id, *old_it++));
} else if (*new_it < *old_it) {
references_to_add->push_back(
SurfaceReference(parent_surface_id, *new_it++));
} else {
++new_it;
++old_it;
}
}
}
} // namespace viz