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 "list_wrapper.h"
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "trace.h"
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem::ListItem(const void* item)
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    : this_iter_(),
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      item_ptr_(item),
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      item_(0)
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem::ListItem(const unsigned int item)
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    : this_iter_(),
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      item_ptr_(0),
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      item_(item)
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem::~ListItem()
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid* ListItem::GetItem() const
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return const_cast<void*>(item_ptr_);
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentunsigned int ListItem::GetUnsignedItem() const
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return item_;
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListWrapper::ListWrapper() : list_()
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListWrapper::~ListWrapper()
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!Empty())
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        // TODO (hellner) I'm not sure this loggin is useful.
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        WEBRTC_TRACE(kTraceMemory, kTraceUtility, -1,
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                   "Potential memory leak in ListWrapper");
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        // Remove all remaining list items.
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        while (Erase(First()) == 0)
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {}
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool ListWrapper::Empty() const
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return list_.empty();
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentunsigned int ListWrapper::GetSize() const
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return list_.size();
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PushBack(const void* ptr)
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* item = new ListItem(ptr);
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.push_back(item);
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PushBack(const unsigned int item_id)
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* item = new ListItem(item_id);
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.push_back(item);
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PushFront(const unsigned int item_id)
86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* item = new ListItem(item_id);
88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.push_front(item);
89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PushFront(const void* ptr)
93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* item = new ListItem(ptr);
95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.push_front(item);
96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PopFront()
100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(list_.empty())
102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.pop_front();
106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::PopBack()
110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(list_.empty())
112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.pop_back();
116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem* ListWrapper::First() const
120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(list_.empty())
122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator item_iter = list_.begin();
126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* return_item = (*item_iter);
127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return_item->this_iter_ = item_iter;
128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return return_item;
129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem* ListWrapper::Last() const
132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(list_.empty())
134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // std::list::end() addresses the last item + 1. Decrement so that the
138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // actual last is accessed.
139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator item_iter = list_.end();
140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    --item_iter;
141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* return_item = (*item_iter);
142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return_item->this_iter_ = item_iter;
143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return return_item;
144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem* ListWrapper::Next(ListItem* item) const
147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(item == NULL)
149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator item_iter = item->this_iter_;
153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ++item_iter;
154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (item_iter == list_.end())
155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* return_item = (*item_iter);
159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return_item->this_iter_ = item_iter;
160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return return_item;
161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListItem* ListWrapper::Previous(ListItem* item) const
164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(item == NULL)
166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator item_iter = item->this_iter_;
170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (item_iter == list_.begin())
171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent      return NULL;
173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    --item_iter;
175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* return_item = (*item_iter);
176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return_item->this_iter_ = item_iter;
177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return return_item;
178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::Insert(ListItem* existing_previous_item,
181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        ListItem* new_item)
182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Allow existingPreviousItem to be NULL if the list is empty.
184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // TODO (hellner) why allow this? Keep it as is for now to avoid
185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // breaking API contract.
186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!existing_previous_item && !Empty())
187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!new_item)
192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator insert_location = list_.begin();
197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!Empty())
198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        insert_location = existing_previous_item->this_iter_;
200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if(insert_location != list_.end())
201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            ++insert_location;
203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.insert(insert_location,new_item);
207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::InsertBefore(ListItem* existing_next_item,
211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                           ListItem* new_item)
212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Allow existing_next_item to be NULL if the list is empty.
214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Todo: why allow this? Keep it as is for now to avoid breaking API
215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // contract.
216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!existing_next_item && !Empty())
217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!new_item)
221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    std::list<ListItem*>::iterator insert_location = list_.begin();
226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (!Empty())
227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        insert_location = existing_next_item->this_iter_;
229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.insert(insert_location,new_item);
232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ListWrapper::Erase(ListItem* item)
236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(item == NULL)
238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    list_.erase(item->this_iter_);
242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return 0;
243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc
245