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