1808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania/*
2808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * Copyright (C) 2010 The Android Open Source Project
3808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * All rights reserved.
4808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *
5808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * Redistribution and use in source and binary forms, with or without
6808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * modification, are permitted provided that the following conditions
7808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * are met:
8808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *  * Redistributions of source code must retain the above copyright
9808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *    notice, this list of conditions and the following disclaimer.
10808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *  * Redistributions in binary form must reproduce the above copyright
11808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *    notice, this list of conditions and the following disclaimer in
12808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *    the documentation and/or other materials provided with the
13808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *    distribution.
14808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania *
15808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania * SUCH DAMAGE.
27808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania */
28808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
29808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania#include <list>
30808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
31808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catanianamespace android {
32808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
33808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Cataniavoid ListNodeBase::swap(ListNodeBase& a, ListNodeBase& b) {
34808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    if (a.mNext != &a) {
35808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        if (b.mNext != &b) {
36808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            // a and b are not empty.
37808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            std::swap(a.mNext, b.mNext);
38808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            std::swap(a.mPrev, b.mPrev);
39808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            a.mNext->mPrev = a.mPrev->mNext = &a;
40808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            b.mNext->mPrev = b.mPrev->mNext = &b;
41808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        } else {
42808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            // a not empty but b is.
43808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            b.mNext = a.mNext;
44808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            b.mPrev = a.mPrev;
45808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            b.mNext->mPrev = b.mPrev->mNext = &b;
46808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania            a.mNext = a.mPrev = &a;  // empty a
47808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        }
48808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    } else if (b.mNext != &b) {
49808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        // a is empty but b is not.
50808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        a.mNext = b.mNext;
51808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        a.mPrev = b.mPrev;
52808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        a.mNext->mPrev = a.mPrev->mNext = &a;
53808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania        b.mNext = b.mPrev = &b;  // empty b
54808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    }
55808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania}
56808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
57808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Cataniavoid ListNodeBase::hook(ListNodeBase *const pos) {
58808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    mNext = pos;
59808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    mPrev = pos->mPrev;
60808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    pos->mPrev->mNext = this;
61808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    pos->mPrev = this;
62808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania}
63808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
64808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Cataniavoid ListNodeBase::unhook() {
65808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    ListNodeBase *const next = mNext;
66808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    ListNodeBase *const prev = mPrev;
67808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    prev->mNext = next;
68808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania    next->mPrev = prev;
69808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania}
70808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania
71808f34a8cab52569bfca26cec6fd96740aa2ea25Nicolas Catania}  // namespace android
72