1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef TOOLS_ANDROID_FORWARDER2_UTIL_H_ 6#define TOOLS_ANDROID_FORWARDER2_UTIL_H_ 7 8#include "base/logging.h" 9 10namespace forwarder2 { 11 12// Safely deletes a ref-counted value in a provided map by unlinking the object 13// from the map before deleting it in case its destructor would access the map. 14// Deletion will only happen by definition if the object's refcount is set to 1 15// before this function gets called. Returns whether the element could be found 16// in the map. 17template <typename Map, typename K> 18bool DeleteRefCountedValueInMap(const K& key, Map* map) { 19 const typename Map::iterator it = map->find(key); 20 if (it == map->end()) 21 return false; 22 DeleteRefCountedValueInMapFromIterator(it, map); 23 return true; 24} 25 26// See DeleteRefCountedValuetInMap() above. 27template <typename Map, typename Iterator> 28void DeleteRefCountedValueInMapFromIterator(Iterator it, Map* map) { 29 DCHECK(it != map->end()); 30 const typename Map::value_type::second_type shared_ptr_copy = it->second; 31 map->erase(it); 32} 33 34} // namespace forwarder2 35 36#endif // TOOLS_ANDROID_FORWARDER2_UTIL_H_ 37