|  | // Copyright 2017 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. | 
|  |  | 
|  | #include "components/services/heap_profiling/backtrace.h" | 
|  |  | 
|  | #include <string.h> | 
|  |  | 
|  | #include <algorithm> | 
|  |  | 
|  | #include "base/hash.h" | 
|  | #include "components/services/heap_profiling/backtrace_storage.h" | 
|  |  | 
|  | namespace heap_profiling { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // TODO(ajwong) replace with a fingerprint capable hash. | 
|  | size_t ComputeHash(const std::vector<Address>& addrs) { | 
|  | if (addrs.empty()) | 
|  | return 0; | 
|  | // Assume Address is a POD containing only the address with no padding. | 
|  | return base::Hash(addrs.data(), addrs.size() * sizeof(Address)); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | Backtrace::Backtrace(std::vector<Address>&& a) | 
|  | : addrs_(std::move(a)), fingerprint_(ComputeHash(addrs_)) {} | 
|  |  | 
|  | Backtrace::Backtrace(Backtrace&& other) noexcept = default; | 
|  |  | 
|  | Backtrace::~Backtrace() {} | 
|  |  | 
|  | Backtrace& Backtrace::operator=(Backtrace&& other) = default; | 
|  |  | 
|  | bool Backtrace::operator==(const Backtrace& other) const { | 
|  | if (addrs_.size() != other.addrs_.size()) | 
|  | return false; | 
|  | return memcmp(addrs_.data(), other.addrs_.data(), | 
|  | addrs_.size() * sizeof(Address)) == 0; | 
|  | } | 
|  |  | 
|  | bool Backtrace::operator!=(const Backtrace& other) const { | 
|  | return !operator==(other); | 
|  | } | 
|  |  | 
|  | }  // namespace heap_profiling |