167 lines
3.2 KiB
C++
167 lines
3.2 KiB
C++
/*
|
|
* 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
|