diff options
Diffstat (limited to 'src/system_wrappers/source/map.cc')
-rw-r--r-- | src/system_wrappers/source/map.cc | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/system_wrappers/source/map.cc b/src/system_wrappers/source/map.cc new file mode 100644 index 0000000000..0bff155be4 --- /dev/null +++ b/src/system_wrappers/source/map.cc @@ -0,0 +1,166 @@ +/* + * 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 |