1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/value_counter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/values.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochValueCounter::ValueCounter() {}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochValueCounter::~ValueCounter() {}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ValueCounter::Entry::Entry(const base::Value& value)
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : value_(value.DeepCopy()), count_(1) {}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochValueCounter::Entry::~Entry() {}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint ValueCounter::Entry::Increment() { return ++count_; }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint ValueCounter::Entry::Decrement() { return --count_; }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint ValueCounter::Add(const base::Value& value) { return AddImpl(value, true); }
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ValueCounter::Remove(const base::Value& value) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*it)->value()->GetType();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*it)->value()->Equals(&value)) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int remaining = (*it)->Decrement();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (remaining == 0) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::swap(*it, entries_.back());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries_.pop_back();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return remaining;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ValueCounter::AddIfMissing(const base::Value& value) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AddImpl(value, false);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ValueCounter::AddImpl(const base::Value& value, bool increment) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (EntryList::iterator it = entries_.begin(); it != entries_.end(); it++) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*it)->value()->Equals(&value))
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return increment ? (*it)->Increment() : (*it)->count();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries_.push_back(linked_ptr<Entry>(new Entry(value)));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
57