map.cc revision c55a96383497a772a307b346368133960b02ad03
1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "map_wrapper.h" 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "trace.h" 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc { 16c55a96383497a772a307b346368133960b02ad03Eric LaurentMapItem::MapItem(int id, void* item) : item_id_(id), item_pointer_(item) 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem::~MapItem() 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid* MapItem::GetItem() 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return item_pointer_; 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint MapItem::GetId() 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return item_id_; 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentunsigned int MapItem::GetUnsignedId() 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return static_cast<unsigned int>(item_id_); 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid MapItem::SetItem(void* ptr) 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item_pointer_ = ptr; 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapWrapper::MapWrapper() : map_() 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapWrapper::~MapWrapper() 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (!map_.empty()) 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1, 53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent "Potential memory leak in MapWrapper"); 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Remove all map items. Please note that std::map::clear() can't be 55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // used because each item has some dynamically allocated memory 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // associated with it (i.e. using std::map::clear would introduce a 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // memory leak). 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while (Erase(First()) == 0) 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent {} 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint MapWrapper::Size() const 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return (int)map_.size(); 66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint MapWrapper::Insert(int id, void* ptr) 69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent map_[id] = new MapItem(id,ptr); 71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem* MapWrapper::First() const 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::const_iterator it = map_.begin(); 77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return it->second; 80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem* MapWrapper::Last() const 85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::const_reverse_iterator it = map_.rbegin(); 87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.rend()) 88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return it->second; 90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem* MapWrapper::Next(MapItem* item) const 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item == 0) 97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_); 101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent it++; 104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return it->second; 107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem* MapWrapper::Previous(MapItem* item) const 113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item == 0) 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_); 120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if ((it != map_.end()) && 121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent (it != map_.begin())) 122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent --it; 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return it->second; 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentMapItem* MapWrapper::Find(int id) const 130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::const_iterator it = map_.find(id); 132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return it->second; 135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint MapWrapper::Erase(MapItem* item) 140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item == 0) 142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::iterator it = map_.find(item->item_id_); 146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete it->second; 149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent map_.erase(it); 150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint MapWrapper::Erase(const int id) 156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent std::map<int, MapItem*>::iterator it = map_.find(id); 158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (it != map_.end()) 159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete it->second; 161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent map_.erase(it); 162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return 0; 163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc 167