Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(789)

Unified Diff: base/location.h

Issue 1013463003: Update from https://crrev.com/320931 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/json/BUILD.gn ('k') | base/location.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/location.h
diff --git a/base/location.h b/base/location.h
index 05a4f66109058242f80a9036248ae57cef725261..477dc022273960d87bf2d618f9366ab6efe3d65d 100644
--- a/base/location.h
+++ b/base/location.h
@@ -5,10 +5,12 @@
#ifndef BASE_LOCATION_H_
#define BASE_LOCATION_H_
+#include <cassert>
#include <string>
#include "base/base_export.h"
#include "base/basictypes.h"
+#include "base/containers/hash_tables.h"
namespace tracked_objects {
@@ -27,18 +29,15 @@ class BASE_EXPORT Location {
// Provide a default constructor for easy of debugging.
Location();
- // Comparison operator for insertion into a std::map<> hash tables.
- // All we need is *some* (any) hashing distinction. Strings should already
- // be unique, so we don't bother with strcmp or such.
- // Use line number as the primary key (because it is fast, and usually gets us
- // a difference), and then pointers as secondary keys (just to get some
- // distinctions).
- bool operator < (const Location& other) const {
- if (line_number_ != other.line_number_)
- return line_number_ < other.line_number_;
- if (file_name_ != other.file_name_)
- return file_name_ < other.file_name_;
- return function_name_ < other.function_name_;
+ // Copy constructor.
+ Location(const Location& other);
+
+ // Comparator for hash map insertion.
+ // No need to use |function_name_| since the other two fields uniquely
+ // identify this location.
+ bool operator==(const Location& other) const {
+ return line_number_ == other.line_number_ &&
+ file_name_ == other.file_name_;
}
const char* function_name() const { return function_name_; }
@@ -48,6 +47,26 @@ class BASE_EXPORT Location {
std::string ToString() const;
+ // Hash operator for hash maps.
+ struct Hash {
+ size_t operator()(const Location& location) const {
+ // Compute the hash value using file name pointer and line number.
+ // No need to use |function_name_| since the other two fields uniquely
+ // identify this location.
+
+ // The file name will always be uniquely identified by its pointer since
+ // it comes from __FILE__, so no need to check the contents of the string.
+ // See the definition of FROM_HERE in location.h, and how it is used
+ // elsewhere.
+
+ // Due to inconsistent definitions of uint64_t and uintptr_t, casting the
+ // file name pointer to a uintptr_t causes a compiler error for some
+ // platforms. The solution is to explicitly cast it to a uint64_t.
+ return base::HashPair(reinterpret_cast<uint64_t>(location.file_name()),
+ location.line_number());
+ }
+ };
+
// Translate the some of the state in this instance into a human readable
// string with HTML characters in the function names escaped, and append that
// string to |output|. Inclusion of the file_name_ and function_name_ are
« no previous file with comments | « base/json/BUILD.gn ('k') | base/location.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698