Home | History | Annotate | Download | only in common
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "extensions/common/value_counter.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/values.h"
     10 
     11 namespace extensions {
     12 
     13 ValueCounter::ValueCounter() {}
     14 
     15 ValueCounter::~ValueCounter() {}
     16 
     17 ValueCounter::Entry::Entry(const base::Value& value)
     18     : value_(value.DeepCopy()), count_(1) {}
     19 
     20 ValueCounter::Entry::~Entry() {}
     21 
     22 int ValueCounter::Entry::Increment() { return ++count_; }
     23 
     24 int ValueCounter::Entry::Decrement() { return --count_; }
     25 
     26 int ValueCounter::Add(const base::Value& value) { return AddImpl(value, true); }
     27 
     28 int ValueCounter::Remove(const base::Value& value) {
     29   for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
     30     (*it)->value()->GetType();
     31     if ((*it)->value()->Equals(&value)) {
     32       int remaining = (*it)->Decrement();
     33       if (remaining == 0) {
     34         std::swap(*it, entries_.back());
     35         entries_.pop_back();
     36       }
     37       return remaining;
     38     }
     39   }
     40   return 0;
     41 }
     42 
     43 int ValueCounter::AddIfMissing(const base::Value& value) {
     44   return AddImpl(value, false);
     45 }
     46 
     47 int ValueCounter::AddImpl(const base::Value& value, bool increment) {
     48   for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
     49     if ((*it)->value()->Equals(&value))
     50       return increment ? (*it)->Increment() : (*it)->count();
     51   }
     52   entries_.push_back(linked_ptr<Entry>(new Entry(value)));
     53   return 1;
     54 }
     55 
     56 }  // namespace extensions
     57