|  | // Copyright 2013 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 TOOLS_ANDROID_FORWARDER2_UTIL_H_ | 
|  | #define TOOLS_ANDROID_FORWARDER2_UTIL_H_ | 
|  |  | 
|  | #include "base/logging.h" | 
|  |  | 
|  | namespace forwarder2 { | 
|  |  | 
|  | // Safely deletes a ref-counted value in a provided map by unlinking the object | 
|  | // from the map before deleting it in case its destructor would access the map. | 
|  | // Deletion will only happen by definition if the object's refcount is set to 1 | 
|  | // before this function gets called. Returns whether the element could be found | 
|  | // in the map. | 
|  | template <typename Map, typename K> | 
|  | bool DeleteRefCountedValueInMap(const K& key, Map* map) { | 
|  | const typename Map::iterator it = map->find(key); | 
|  | if (it == map->end()) | 
|  | return false; | 
|  | DeleteRefCountedValueInMapFromIterator(it, map); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | // See DeleteRefCountedValuetInMap() above. | 
|  | template <typename Map, typename Iterator> | 
|  | void DeleteRefCountedValueInMapFromIterator(Iterator it, Map* map) { | 
|  | DCHECK(it != map->end()); | 
|  | const typename Map::value_type::second_type shared_ptr_copy = it->second; | 
|  | map->erase(it); | 
|  | } | 
|  |  | 
|  | }  // namespace forwarder2 | 
|  |  | 
|  | #endif  // TOOLS_ANDROID_FORWARDER2_UTIL_H_ |