// 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. #ifndef CHROME_TEST_CHROMEDRIVER_SYNCHRONIZED_MAP_H_ #define CHROME_TEST_CHROMEDRIVER_SYNCHRONIZED_MAP_H_ #include #include #include #include "base/basictypes.h" #include "base/synchronization/lock.h" template class SynchronizedMap { public: SynchronizedMap(); ~SynchronizedMap(); void Set(const K& key, const V& value); bool Get(const K& key, V* value) const; bool Has(const K& key) const; bool Remove(const K& key); void GetKeys(std::vector* keys) const; private: typedef std::map Map; Map map_; mutable base::Lock map_lock_; DISALLOW_COPY_AND_ASSIGN(SynchronizedMap); }; template SynchronizedMap::SynchronizedMap() {} template SynchronizedMap::~SynchronizedMap() {} template void SynchronizedMap::Set(const K& key, const V& value) { base::AutoLock lock(map_lock_); typename Map::iterator iter = map_.find(key); if (iter != map_.end()) map_.erase(iter); map_.insert(std::make_pair(key, value)); } template bool SynchronizedMap::Get(const K& key, V* value) const { base::AutoLock lock(map_lock_); typename Map::const_iterator iter = map_.find(key); if (iter == map_.end()) return false; *value = iter->second; return true; } template bool SynchronizedMap::Has(const K& key) const { base::AutoLock lock(map_lock_); return map_.find(key) != map_.end(); } template bool SynchronizedMap::Remove(const K& key) { base::AutoLock lock(map_lock_); typename Map::iterator iter = map_.find(key); if (iter == map_.end()) return false; map_.erase(iter); return true; } template void SynchronizedMap::GetKeys(std::vector* keys) const { keys->clear(); base::AutoLock lock(map_lock_); typename Map::const_iterator iter; for (iter = map_.begin(); iter != map_.end(); iter++) keys->push_back(iter->first); } #endif // CHROME_TEST_CHROMEDRIVER_SYNCHRONIZED_MAP_H_