blob: 0bff155be4bbb6b4ce6796028e3e3f5762e26e6b [file] [log] [blame]
niklase@google.comf0779a22011-05-30 11:39:38 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "map_wrapper.h"
12
13#include "trace.h"
14
15namespace webrtc {
16MapItem::MapItem(int id, void* item) : item_pointer_(item), item_id_(id)
17{
18}
19
20MapItem::~MapItem()
21{
22}
23
24void* MapItem::GetItem()
25{
26 return item_pointer_;
27}
28
29int MapItem::GetId()
30{
31 return item_id_;
32}
33
34unsigned int MapItem::GetUnsignedId()
35{
36 return static_cast<unsigned int>(item_id_);
37}
38
39void MapItem::SetItem(void* ptr)
40{
41 item_pointer_ = ptr;
42}
43
44MapWrapper::MapWrapper() : map_()
45{
46}
47
48MapWrapper::~MapWrapper()
49{
50 if (!map_.empty())
51 {
52 WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
53 "Potential memory leak in MapWrapper");
54 // Remove all map items. Please note that std::map::clear() can't be
55 // used because each item has some dynamically allocated memory
56 // associated with it (i.e. using std::map::clear would introduce a
57 // memory leak).
58 while (Erase(First()) == 0)
59 {}
60 }
61}
62
63int MapWrapper::Size() const
64{
65 return (int)map_.size();
66}
67
68int MapWrapper::Insert(int id, void* ptr)
69{
70 map_[id] = new MapItem(id,ptr);
71 return 0;
72}
73
74MapItem* MapWrapper::First() const
75{
76 std::map<int, MapItem*>::const_iterator it = map_.begin();
77 if (it != map_.end())
78 {
79 return it->second;
80 }
81 return 0;
82}
83
84MapItem* MapWrapper::Last() const
85{
86 std::map<int, MapItem*>::const_reverse_iterator it = map_.rbegin();
87 if (it != map_.rend())
88 {
89 return it->second;
90 }
91 return 0;
92}
93
94MapItem* MapWrapper::Next(MapItem* item) const
95{
96 if (item == 0)
97 {
98 return 0;
99 }
100 std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_);
101 if (it != map_.end())
102 {
103 it++;
104 if (it != map_.end())
105 {
106 return it->second;
107 }
108 }
109 return 0;
110}
111
112MapItem* MapWrapper::Previous(MapItem* item) const
113{
114 if (item == 0)
115 {
116 return 0;
117 }
118
119 std::map<int, MapItem*>::const_iterator it = map_.find(item->item_id_);
120 if ((it != map_.end()) &&
121 (it != map_.begin()))
122 {
123 --it;
124 return it->second;
125 }
126 return 0;
127}
128
129MapItem* MapWrapper::Find(int id) const
130{
131 std::map<int, MapItem*>::const_iterator it = map_.find(id);
132 if (it != map_.end())
133 {
134 return it->second;
135 }
136 return 0;
137}
138
139int MapWrapper::Erase(MapItem* item)
140{
141 if (item == 0)
142 {
143 return -1;
144 }
145 std::map<int, MapItem*>::iterator it = map_.find(item->item_id_);
146 if (it != map_.end())
147 {
148 delete it->second;
149 map_.erase(it);
150 return 0;
151 }
152 return -1;
153}
154
155int MapWrapper::Erase(const int id)
156{
157 std::map<int, MapItem*>::iterator it = map_.find(id);
158 if (it != map_.end())
159 {
160 delete it->second;
161 map_.erase(it);
162 return 0;
163 }
164 return -1;
165}
166} // namespace webrtc