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#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <list>
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "constructor_magic.h"
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ListItem
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentfriend class ListWrapper;
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic:
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem(const void* ptr);
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem(const unsigned int item);
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual ~ListItem();
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    void* GetItem() const;
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    unsigned int GetUnsignedItem() const;
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate:
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    mutable std::list<ListItem*>::iterator this_iter_;
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const void*         item_ptr_;
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const unsigned int  item_;
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    DISALLOW_COPY_AND_ASSIGN(ListItem);
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ListWrapper
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic:
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListWrapper();
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ~ListWrapper();
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // ListWrapper functions
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    unsigned int GetSize() const;
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PushBack(const void* ptr);
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PushBack(const unsigned int item_id);
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PushFront(const void* ptr);
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PushFront(const unsigned int item_id);
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PopFront();
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int PopBack();
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    bool Empty() const;
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* First() const;
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* Last() const;
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* Next(ListItem* item) const;
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ListItem* Previous(ListItem* item) const;
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int Erase(ListItem* item);
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int Insert(ListItem* existing_previous_item, ListItem* new_item);
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int InsertBefore(ListItem* existing_next_item, ListItem* new_item);
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprivate:
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    mutable std::list<ListItem*> list_;
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    DISALLOW_COPY_AND_ASSIGN(ListWrapper);
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_LIST_STL_H_
67