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 "components/invalidation/single_object_invalidation_set.h" 6 7#include "base/values.h" 8#include "components/invalidation/invalidation_util.h" 9 10namespace syncer { 11 12SingleObjectInvalidationSet::SingleObjectInvalidationSet() {} 13 14SingleObjectInvalidationSet::~SingleObjectInvalidationSet() {} 15 16void SingleObjectInvalidationSet::Insert(const Invalidation& invalidation) { 17 invalidations_.insert(invalidation); 18} 19 20void SingleObjectInvalidationSet::InsertAll( 21 const SingleObjectInvalidationSet& other) { 22 invalidations_.insert(other.begin(), other.end()); 23} 24 25void SingleObjectInvalidationSet::Clear() { 26 invalidations_.clear(); 27} 28 29void SingleObjectInvalidationSet::Erase(const_iterator it) { 30 invalidations_.erase(*it); 31} 32 33bool SingleObjectInvalidationSet::StartsWithUnknownVersion() const { 34 return !invalidations_.empty() && 35 invalidations_.begin()->is_unknown_version(); 36} 37 38size_t SingleObjectInvalidationSet::GetSize() const { 39 return invalidations_.size(); 40} 41 42bool SingleObjectInvalidationSet::IsEmpty() const { 43 return invalidations_.empty(); 44} 45 46namespace { 47 48struct InvalidationComparator { 49 bool operator()(const Invalidation& inv1, const Invalidation& inv2) { 50 return inv1.Equals(inv2); 51 } 52}; 53 54} // namespace 55 56bool SingleObjectInvalidationSet::operator==( 57 const SingleObjectInvalidationSet& other) const { 58 return std::equal(invalidations_.begin(), 59 invalidations_.end(), 60 other.invalidations_.begin(), 61 InvalidationComparator()); 62} 63 64SingleObjectInvalidationSet::const_iterator 65SingleObjectInvalidationSet::begin() const { 66 return invalidations_.begin(); 67} 68 69SingleObjectInvalidationSet::const_iterator 70SingleObjectInvalidationSet::end() const { 71 return invalidations_.end(); 72} 73 74SingleObjectInvalidationSet::const_reverse_iterator 75SingleObjectInvalidationSet::rbegin() const { 76 return invalidations_.rbegin(); 77} 78 79SingleObjectInvalidationSet::const_reverse_iterator 80SingleObjectInvalidationSet::rend() const { 81 return invalidations_.rend(); 82} 83 84const Invalidation& SingleObjectInvalidationSet::back() const { 85 return *invalidations_.rbegin(); 86} 87 88scoped_ptr<base::ListValue> SingleObjectInvalidationSet::ToValue() const { 89 scoped_ptr<base::ListValue> value(new base::ListValue); 90 for (InvalidationsSet::const_iterator it = invalidations_.begin(); 91 it != invalidations_.end(); ++it) { 92 value->Append(it->ToValue().release()); 93 } 94 return value.Pass(); 95} 96 97bool SingleObjectInvalidationSet::ResetFromValue( 98 const base::ListValue& list) { 99 for (size_t i = 0; i < list.GetSize(); ++i) { 100 const base::DictionaryValue* dict; 101 if (!list.GetDictionary(i, &dict)) { 102 DLOG(WARNING) << "Could not find invalidation at index " << i; 103 return false; 104 } 105 scoped_ptr<Invalidation> invalidation = Invalidation::InitFromValue(*dict); 106 if (!invalidation) { 107 DLOG(WARNING) << "Failed to parse invalidation at index " << i; 108 return false; 109 } 110 invalidations_.insert(*invalidation); 111 } 112 return true; 113} 114 115} // namespace syncer 116