普通文本  |  68行  |  1.53 KB

// Copyright (c) 2012 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 "chrome/common/extensions/value_counter.h"

#include "base/values.h"

#include <algorithm>

namespace extensions {

ValueCounter::ValueCounter() {
}

ValueCounter::~ValueCounter() {
}

ValueCounter::Entry::Entry(const base::Value& value)
    : value_(value.DeepCopy()),
      count_(1) {
}

ValueCounter::Entry::~Entry() {
}

int ValueCounter::Entry::Increment() {
  return ++count_;
}

int ValueCounter::Entry::Decrement() {
  return --count_;
}

int ValueCounter::Add(const base::Value& value) {
  return AddImpl(value, true);
}

int ValueCounter::Remove(const base::Value& value) {
  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
    (*it)->value()->GetType();
    if ((*it)->value()->Equals(&value)) {
      int remaining = (*it)->Decrement();
      if (remaining == 0) {
        std::swap(*it, entries_.back());
        entries_.pop_back();
      }
      return remaining;
    }
  }
  return 0;
}

int ValueCounter::AddIfMissing(const base::Value& value) {
  return AddImpl(value, false);
}

int ValueCounter::AddImpl(const base::Value& value, bool increment) {
  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
    if ((*it)->value()->Equals(&value))
      return increment ? (*it)->Increment() : (*it)->count();
  }
  entries_.push_back(linked_ptr<Entry>(new Entry(value)));
  return 1;
}

}  // namespace extensions