| /* |
| * 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_id_(id), item_pointer_(item) |
| { |
| } |
| |
| 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 |