Chromium Code Reviews| Index: chrome/browser/download/download_id.h |
| diff --git a/chrome/browser/download/download_id.h b/chrome/browser/download/download_id.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..bdfe5439e11da85c0a154033fe13059901d8ebef |
| --- /dev/null |
| +++ b/chrome/browser/download/download_id.h |
| @@ -0,0 +1,90 @@ |
| +// Copyright (c) 2011 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_DOWNLOAD_DOWNLOAD_ID_H_ |
| +#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ID_H_ |
| +#pragma once |
| + |
| +#include <iostream> |
| + |
| +#include "base/hash_tables.h" |
| + |
| +class DownloadManager; |
| + |
| +// DownloadId combines per-profile Download ids with an indication of which |
| +// profile in order to be globally unique. DownloadIds are not persistent across |
| +// sessions, but their local() field is. |
| +class DownloadId { |
| + public: |
| + explicit DownloadId(const DownloadManager* manager = NULL, |
|
willchan no longer on Chromium
2011/08/06 14:08:36
http://google-styleguide.googlecode.com/svn/trunk/
benjhayden
2011/08/08 16:50:19
Done.
|
| + int32 local_id = -1) |
| + : manager_(manager), |
| + local_id_(local_id) { |
| + } |
| + |
| + // Return the per-profile and persistent part of this DownloadId. |
| + int32 local() const { return local_id_; } |
| + |
| + // Returns true if this DownloadId has been allocated and could possibly refer |
| + // to a DownloadItem that exists. |
| + bool IsValid() const { return ((manager_ != NULL) && (local_id_ >= 0)); } |
| + |
| + // Returns true if this DownloadId was allocated by |manager|. |
| + bool BelongsTo(const DownloadManager* manager) const { |
| + return manager == manager_; |
| + } |
| + |
| + // The following methods (operator==, operator<, hash(), copy, and assign) |
| + // provide support for STL containers such as hash_map and set. |
| + |
| + // Returns true if this refers to the same DownloadItem as that. |
|
willchan no longer on Chromium
2011/08/06 14:08:36
Where do you need this operator==?
benjhayden
2011/08/08 16:50:19
It looks like hash_map uses operator== on its keys
|
| + bool operator==(const DownloadId& that) const { |
| + return ((that.local_id_ == local_id_) && |
| + (that.manager_ == manager_)); |
| + } |
| + bool operator<(const DownloadId& that) const { |
|
willchan no longer on Chromium
2011/08/06 14:08:36
operator< does not make sense and I'm not sure you
benjhayden
2011/08/08 16:50:19
Done.
|
| + return ((manager_ < that.manager_) || |
| + (local_id_ < that.local_id_)); |
| + } |
| + |
| + size_t hash() const { |
| + // The top half of manager is unlikely to be distinct, and the user is |
| + // unlikely to have >64K downloads. If these assumptions are incorrect, then |
| + // DownloadFileManager's hash_map might have a few collisions, but it will |
| + // use operator== to safely disambiguate. |
| + return reinterpret_cast<size_t>(manager_) + |
| + (static_cast<size_t>(local_id_) << (4 * sizeof(size_t))); |
| + } |
| + |
| + private: |
| + // DownloadId is used mostly off the UI thread, so manager's methods can't be |
| + // called, but the pointer can be compared. |
| + const DownloadManager* manager_; |
| + |
| + int32 local_id_; |
| + |
| + friend std::ostream& operator<<(std::ostream& out, |
| + const DownloadId& global_id); |
| + |
| + // Allow copy and assign. |
| +}; |
| + |
| +// Allow logging DownloadIds. Looks like "0x01234567:42". |
| +std::ostream& operator<<(std::ostream& out, const DownloadId& global_id); |
| + |
| +// Allow using DownloadIds as keys in hash_maps. |
| +namespace BASE_HASH_NAMESPACE { |
| +#if defined(COMPILER_GCC) |
| +template<> struct hash<DownloadId> { |
| + std::size_t operator()(const DownloadId& id) const { |
| + return id.hash(); |
| + } |
| +}; |
| +#elif defined(COMPILER_MSVC) |
| +inline size_t hash_value(const DownloadId& id) { |
| + return id.hash(); |
| +} |
| +#endif // COMPILER |
| +} |
| +#endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_ID_H_ |