/* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "map_wrapper.h" #include "trace.h" namespace webrtc { MapItem::MapItem(int id, void* item) : item_pointer_(item), item_id_(id) { } MapItem::~MapItem() { } void* MapItem::GetItem() { return item_pointer_; } int MapItem::GetId() { return item_id_; } unsigned int MapItem::GetUnsignedId() { return static_cast<unsigned int>(item_id_); } void MapItem::SetItem(void* ptr) { item_pointer_ = ptr; } MapWrapper::MapWrapper() : map_() { } MapWrapper::~MapWrapper() { if (!map_.empty()) { WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1, "Potential memory leak in MapWrapper"); // Remove all map items. Please note that std::map::clear() can't be // used because each item has some dynamically allocated memory // associated with it (i.e. using std::map::clear would introduce a // memory leak). while (Erase(First()) == 0) {} } } int MapWrapper::Size() const { return (int)map_.size(); } int MapWrapper::Insert(int id, void* ptr) { map_[id] = new MapItem(id,ptr); return 0; } MapItem* MapWrapper::First() const { std::map<int, MapItem*>::const_iterator it = map_.begin(); if (it != map_.end()) { return it->second; } return 0; } MapItem* MapWrapper::Last() const { std::map<int, MapItem*>::const_reverse_iterator it = map_.rbegin(); if (it != map_.rend()) { return it->second; } return 0; } MapItem* MapWrapper::Next(MapItem* item) const { if (item == 0) { return 0; } std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_); if (it != map_.end()) { it++; if (it != map_.end()) { return it->second; } } return 0; } MapItem* MapWrapper::Previous(MapItem* item) const { if (item == 0) { return 0; } std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_); if ((it != map_.end()) && (it != map_.begin())) { --it; return it->second; } return 0; } MapItem* MapWrapper::Find(int id) const { std::map<int, MapItem*>::const_iterator it = map_.find(id); if (it != map_.end()) { return it->second; } return 0; } int MapWrapper::Erase(MapItem* item) { if (item == 0) { return -1; } std::map<int, MapItem*>::iterator it = map_.find(item->item_id_); if (it != map_.end()) { delete it->second; map_.erase(it); return 0; } return -1; } int MapWrapper::Erase(const int id) { std::map<int, MapItem*>::iterator it = map_.find(id); if (it != map_.end()) { delete it->second; map_.erase(it); return 0; } return -1; } } // namespace webrtc