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