mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
|
// 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.
|
||
|
|
||
|
#include "base/supports_user_data.h"
|
||
|
|
||
|
namespace base {
|
||
|
|
||
|
SupportsUserData::SupportsUserData() {
|
||
|
// Harmless to construct on a different execution sequence to subsequent
|
||
|
// usage.
|
||
|
sequence_checker_.DetachFromSequence();
|
||
|
}
|
||
|
|
||
|
SupportsUserData::Data* SupportsUserData::GetUserData(const void* key) const {
|
||
|
DCHECK(sequence_checker_.CalledOnValidSequence());
|
||
|
// Avoid null keys; they are too vulnerable to collision.
|
||
|
DCHECK(key);
|
||
|
DataMap::const_iterator found = user_data_.find(key);
|
||
|
if (found != user_data_.end())
|
||
|
return found->second.get();
|
||
|
return nullptr;
|
||
|
}
|
||
|
|
||
|
void SupportsUserData::SetUserData(const void* key,
|
||
|
std::unique_ptr<Data> data) {
|
||
|
DCHECK(sequence_checker_.CalledOnValidSequence());
|
||
|
// Avoid null keys; they are too vulnerable to collision.
|
||
|
DCHECK(key);
|
||
|
user_data_[key] = std::move(data);
|
||
|
}
|
||
|
|
||
|
void SupportsUserData::RemoveUserData(const void* key) {
|
||
|
DCHECK(sequence_checker_.CalledOnValidSequence());
|
||
|
user_data_.erase(key);
|
||
|
}
|
||
|
|
||
|
void SupportsUserData::DetachFromSequence() {
|
||
|
sequence_checker_.DetachFromSequence();
|
||
|
}
|
||
|
|
||
|
SupportsUserData::~SupportsUserData() {
|
||
|
DCHECK(sequence_checker_.CalledOnValidSequence() || user_data_.empty());
|
||
|
DataMap local_user_data;
|
||
|
user_data_.swap(local_user_data);
|
||
|
// Now this->user_data_ is empty, and any destructors called transitively from
|
||
|
// the destruction of |local_user_data| will see it that way instead of
|
||
|
// examining a being-destroyed object.
|
||
|
}
|
||
|
|
||
|
} // namespace base
|