// 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.
#ifndef CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MAP_H_
#define CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MAP_H_
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/stl_util.h"
#include "base/time/time.h"
namespace contacts {
class Contact;
// Stores Contact objects indexed by their IDs.
class ContactMap {
public:
typedef std::map<std::string, Contact*> Map;
typedef Map::const_iterator const_iterator;
// What should Merge() do when passed a deleted contact?
enum DeletedContactPolicy {
// The deleted contact will be inserted into the map.
KEEP_DELETED_CONTACTS,
// The deleted contact will not be deleted from the map, and if there is a
// previous version of the now-deleted contact already in the map, it will
// also be removed.
DROP_DELETED_CONTACTS,
};
ContactMap();
~ContactMap();
bool empty() const { return contacts_.empty(); }
size_t size() const { return contacts_.size(); }
const_iterator begin() const { return contacts_.begin(); }
const_iterator end() const { return contacts_.end(); }
// Returns the contact with ID |contact_id|. NULL is returned if the contact
// isn't present.
const Contact* Find(const std::string& contact_id) const;
// Deletes the contact with ID |contact_id|.
void Erase(const std::string& contact_id);
// Deletes all contacts.
void Clear();
// Merges |updated_contacts| into |contacts_|.
void Merge(scoped_ptr<ScopedVector<Contact> > updated_contacts,
DeletedContactPolicy policy);
private:
Map contacts_;
// Deletes values in |contacts_|.
STLValueDeleter<Map> contacts_deleter_;
DISALLOW_COPY_AND_ASSIGN(ContactMap);
};
} // namespace contacts
#endif // CHROME_BROWSER_CHROMEOS_CONTACTS_CONTACT_MAP_H_