// Copyright 2014 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 "extensions/common/value_counter.h" #include #include #include "base/values.h" namespace extensions { struct ValueCounter::Entry { explicit Entry(scoped_ptr value) : value(std::move(value)), count(1) {} scoped_ptr value; int count; }; ValueCounter::ValueCounter() { } ValueCounter::~ValueCounter() { } bool ValueCounter::Add(const base::Value& value) { for (const auto& entry : entries_) { if (entry->value->Equals(&value)) { ++entry->count; return false; } } entries_.push_back(make_scoped_ptr(new Entry(value.CreateDeepCopy()))); return true; } bool ValueCounter::Remove(const base::Value& value) { for (auto it = entries_.begin(); it != entries_.end(); ++it) { if ((*it)->value->Equals(&value)) { if (--(*it)->count == 0) { std::swap(*it, entries_.back()); entries_.pop_back(); return true; // Removed the last entry. } return false; // Removed, but no the last entry. } } return false; // Nothing to remove. } } // namespace extensions