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