/* * Copyright 2008-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ package org.visage.runtime.util; /** * Linkables -- methods for manipulating linked lists. * * @author Brian Goetz */ public abstract class Linkables { public static<T extends Linkable<T>> boolean isUnused(T element) { return element.getPrev() == null && element.getNext() == null; } public static<T extends Linkable<T>> Linkable<T> findLast(Linkable<T> host) { Linkable<T> cur = host; T next; while ((next = cur.getNext()) != null) cur = next; return cur; } public static<T extends Linkable<T>> void addAfter(Linkable<T> existing, T element) { /*assert(existing.getNext() == null); assert(element.getPrev() == null); assert(element.getNext() == null);*/ T next = existing.getNext(); existing.setNext(element); element.setPrev(existing); element.setNext(next); if (next != null) next.setPrev(element); } public static<T extends Linkable<T>> void addAtEnd(Linkable<T> host, T element) { addAfter(findLast(host), element); } public static<T extends Linkable<T>> boolean remove(T element) { T next = element.getNext(); Linkable<T> prev = element.getPrev(); if (next == null && prev == null) return false; else { if (prev != null) prev.setNext(next); if (next != null) next.setPrev(prev); element.setNext(null); element.setPrev(null); return true; } } public static<T extends Linkable<T>> int size(Linkable<T> first) { int size = 0; for (Linkable<T> cur = first; cur != null; cur = cur.getNext()) ++size; return size; } }